SQL RIGHT JOIN: все строки правой таблицы
Урок 5.4 · Время чтения: ~4 мин
RIGHT JOIN в SQL возвращает каждую строку правой таблицы и совпадающие строки левой; где совпадения нет, столбцы левой таблицы равны NULL. В этом уроке вы изучите синтаксис RIGHT JOIN, увидите, как он зеркально отражает LEFT JOIN, и узнаете, почему большинство разработчиков переписывают его через LEFT JOIN.
RIGHT JOIN - зеркальное отражение LEFT JOIN. Разница только в том, какая таблица сохраняет все свои строки: при LEFT JOIN это таблица после FROM, при RIGHT JOIN - таблица после JOIN.
Что возвращает RIGHT JOIN
- Каждая строка правой таблицы (той, что после
RIGHT JOIN) появляется в результате. - Строки с совпадениями объединяются с ними, как в
INNER JOIN. - Строки без совпадения получают
NULLво всех столбцах левой таблицы.
RIGHT JOIN и RIGHT OUTER JOIN - одно и то же.
Базовый синтаксис
SELECT left_table.column1, right_table.column2
FROM left_table
RIGHT JOIN right_table ON left_table.key_column = right_table.key_column;
Пример: все адреса и их сотрудники
Таблица address хранит адреса клиентов, сотрудников и магазинов. Чтобы вывести все адреса и показать, какие из них принадлежат сотрудникам:
SELECT s.first_name, s.last_name, a.address, a.district
FROM staff AS s
RIGHT JOIN address AS a ON s.address_id = a.address_id
ORDER BY s.staff_id IS NULL, a.address
LIMIT 10;
Результат: все 603 адреса; первыми идут два адреса сотрудников с их именами, у остальных first_name и last_name равны NULL.
RIGHT JOIN как LEFT JOIN
Любой RIGHT JOIN можно переписать как LEFT JOIN, поменяв таблицы местами. Эти два запроса возвращают одинаковые строки:
-- RIGHT 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;
-- LEFT JOIN с переставленными таблицами: тот же результат
SELECT s.first_name, s.last_name, a.address
FROM address AS a
LEFT JOIN staff AS s ON s.address_id = a.address_id;
Результат: оба запроса возвращают 603 строки.
Большинство разработчиков используют только LEFT JOIN. Тогда запрос читается естественно: главная таблица стоит первой после FROM, а каждое следующее соединение лишь добавляет к ней информацию. Смешение LEFT и RIGHT в одном запросе мешает понять, какие строки гарантированно останутся.
Когда RIGHT JOIN полезен
- Чтение чужого кода.
RIGHT JOINвстречается в запросах других людей и в запросах, сгенерированных инструментами. - Добавление таблицы в конец длинного запроса. Иногда проще дописать
RIGHT JOIN, чем переставлять длинную цепочку соединений. Но и в этом случае переписанный черезLEFT JOINзапрос обычно понятнее.
SQLite поддерживает RIGHT JOIN только с версии 3.39 (2022); в более старых версиях используйте LEFT JOIN с переставленными таблицами.
Ключевые выводы:
RIGHT JOINсохраняет каждую строку правой таблицы; строки без совпадения получаютNULLв столбцах левой таблицы.A RIGHT JOIN Bвозвращает те же строки, что иB LEFT JOIN A.- В большинстве запросов используют
LEFT JOINс главной таблицей послеFROM- так легче читать. - Не смешивайте
LEFT JOINиRIGHT JOINв одном запросе.
Часто задаваемые вопросы
Чем отличаются LEFT JOIN и RIGHT JOIN?
LEFT JOIN сохраняет все строки таблицы после FROM, RIGHT JOIN - все строки таблицы после JOIN. Если поменять таблицы местами, одно превращается в другое.
Почему разработчики редко используют RIGHT JOIN?
Потому что LEFT JOIN с переставленными таблицами даёт тот же результат и читается естественнее: главная таблица идёт первой, а присоединяемые таблицы добавляют к ней детали.
RIGHT JOIN и RIGHT OUTER JOIN - одно и то же?
Да. Ключевое слово OUTER необязательно.