RIGHT JOIN (или RIGHT OUTER JOIN) является логической противоположностью LEFT JOIN. Он гарантирует, что все строки из «правой» таблицы (той, которая указана после ключевого слова JOIN) будут включены в результирующий набор данных, независимо от того, есть ли для них совпадения в «левой» таблице.
RIGHT JOIN возвращает все строки из правой таблицы и только совпадающие строки из левой таблицы. Если совпадения в левой таблице не найдено, результат будет содержать значения NULL в столбцах левой таблицы.
Визуализация:
Таблица A (customer) Таблица B (payment)
+----+----------+ +----+----------+
| id | name | | id | amount |
+----+----------+ +----+----------+
| 1 | Alice | <--------> | 1 | 10.00 | (Совпадение!)
| NULL | <--------> | 4 | 50.00 | (Нет совпадения, платеж 4 остается!)
+----+----------+ +----+----------+
В этом примере платеж с ID 4 сохраняется, даже если с ним не связан ни один клиент (хотя в хорошо спроектированной базе данных, такой как Sakila, это случается редко из-за ограничений внешнего ключа).
Синтаксис следует тому же шаблону, что и другие соединения:
SELECT
table1.column1,
table2.column2
FROM
table1
RIGHT JOIN
table2 ON table1.common_column = table2.common_column;
RIGHT JOIN: Гарантирует сохранение всех строк из table2 (правой таблицы).ON: Условие соединения.Хотя на практике RIGHT JOIN встречается реже, чем LEFT JOIN (так как любой RIGHT JOIN можно переписать как LEFT JOIN, поменяв таблицы местами), его важно понимать.
Предположим, мы хотим просмотреть все адреса в нашей системе и проверить, закреплены ли за ними сотрудники в данный момент.
SELECT
s.first_name,
s.last_name,
a.address
FROM
staff AS s
RIGHT JOIN
address AS a ON s.address_id = a.address_id
ORDER BY
s.last_name;
Запрос вернет все адреса из таблицы address. Если к адресу не привязан сотрудник, имена будут NULL.
Любой RIGHT JOIN можно выразить через LEFT JOIN. Большинство разработчиков SQL предпочитают использовать исключительно LEFT JOIN, просто меняя порядок таблиц так, чтобы «основная» таблица оставалась слева. Это обычно делает запрос более удобным для чтения сверху вниз.
Пример эквивалентности:
-- Использование RIGHT JOIN
SELECT f.title, i.inventory_id
FROM film f
RIGHT JOIN inventory i ON f.film_id = i.film_id;
-- Использование LEFT JOIN (тот же результат)
SELECT f.title, i.inventory_id
FROM inventory i
LEFT JOIN film f ON i.film_id = f.film_id;
LEFT JOIN.