🚀 Начался ноябрь! SQLtest.online остаётся бесплатным благодаря донатам таких людей, как вы. Помогите собрать сумму этого месяца пораньше, чтобы сайт работал без перебоев. Поддержать сейчас →
SQL код скопирован в буфер обмена

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.

SQL RIGHT JOIN: все строки правой таблицы сохраняются, строки без совпадения получают NULL в столбцах левой таблицы; тот же результат, что у LEFT 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 необязательно.