Давайте начнем с определения. RIGHT JOIN — это тип соединения, который возвращает все строки из правой таблицы (именно поэтому он называется "правый"), а из левой — только совпадающие строки. Если в левой таблице данных, соответствующих строке правой таблицы, нет — будут возвращены NULL значения для столбцов левой таблицы.
Вы уже знакомы с LEFT JOIN, это почти то же самое, но "зеркально". Основное отличие в том, какая таблица считается основной: левая или правая.
Синтаксис RIGHT JOIN
Синтаксис RIGHT JOIN практически идентичен LEFT JOIN. Вот его структура:
SELECT
столбцы
FROM
таблица_левая RIGHT JOIN таблица_правая
ON
условие_объединения;
Обратите внимание на порядок таблиц:
- левая таблица пишется до
RIGHT JOIN; - правая таблица приводится после слова
RIGHT JOIN.
Представим, что у нас есть две таблицы:
students — список студентов:
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Maria |
| 3 | Alex |
enrollments — записи о зачислениях студентов на курсы:
| enrollment_id | course_name | student_id |
|---|---|---|
| 101 | Математика | 1 |
| 102 | Информатика | 2 |
| 103 | Биология | NULL |
Теперь мы хотим получить список всех записей о зачислениях, а также информацию о студентах, если они существуют. Если студент не найден, мы увидим NULL вместо информации о студенте.
Запрос с использованием RIGHT JOIN будет выглядеть так:
SELECT
enrollments.enrollment_id,
enrollments.course_name,
students.name AS student_name
FROM
students RIGHT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Результат:
| enrollment_id | course_name | student_name |
|---|---|---|
| 101 | Математика | Otto |
| 102 | Информатика | Maria |
| 103 | Биология | NULL |
Здесь мы видим, что все записи из таблицы enrollments (правая таблица) попали в результат, даже если для них нет совпадений в таблице students (левая таблица).
Сравнение RIGHT JOIN и LEFT JOIN
Если вы уже понимаете, как работает LEFT JOIN, вы можете подумать: "А зачем вообще нужен RIGHT JOIN? Почему не использовать LEFT JOIN?" Хороший вопрос! Давайте разберем различия и случаи, когда стоит выбрать именно RIGHT JOIN.
Направление данных
LEFT JOIN: возвращает все строки из левой таблицы, независимо от того, есть ли совпадения в правой таблице.RIGHT JOIN: возвращает все строки из правой таблицы, даже если совпадений в левой таблице нет.
Выбор основной таблицы Обычно вы выбираете
LEFTилиRIGHTв зависимости от того, какая таблица (левая или правая) для вас важнее и в каком порядке удобнее писать запрос.Эквивалентность Любой
RIGHT JOINможно переписать какLEFT JOINс изменением порядка таблиц. Например:-- RIGHT JOIN SELECT * FROM students RIGHT JOIN enrollments ON students.student_id = enrollments.student_id; -- Эквивалентный LEFT JOIN SELECT * FROM enrollments LEFT JOIN students ON students.student_id = enrollments.student_id;
Так что, если вы не фанат слова RIGHT JOIN, вы всегда можете его избегать!
Когда использовать RIGHT JOIN?
На практике RIGHT JOIN используется реже, чем LEFT JOIN. Но есть сценарии, когда он может быть полезен:
- Если правая таблица более важна (например, она вашей основной таблицей);
- Когда вы хотите организовать запрос в таком порядке, где правая таблица логически идет после левой;
- Если вы работаете с уже написанным кодом, который стандартно использует
RIGHT JOIN.
Визуальное представление RIGHT JOIN
Чтобы лучше понять RIGHT JOIN, давайте взглянем на схему:
Левая таблица Правая таблица
[ A ] --------> [ 1 ]
[ B ] --------> [ 2 ]
[ C ] --------> [ 3 ]
[ D ] [ 4 ]
При использовании RIGHT JOIN мы получим все значения из правой таблицы вместе с соответствующими данными из левой таблицы. То, что отсутствует в левой таблице, будет заполнено NULL.
Практическое задание
Давайте проверим ваши знания на практике. Вот задание:
У вас есть таблицы departments с отделами и employees с сотрудниками: departments:
| department_id | department_name |
|---|---|
| 1 | IT |
| 2 | Продажи |
| 3 | Бухгалтерия |
employees:
| employee_id | name | department_id |
|---|---|---|
| 101 | Peter | 1 |
| 102 | Eva | 2 |
| 103 | Ron | NULL |
Напишите запрос с использованием RIGHT JOIN, который вернет список всех отделов, включая сотрудников, если они находятся в отделе, или NULL, если сотрудников нет.
Попробуйте сначала решить задачу самостоятельно, прежде чем заглядывать в ответ.
Ответ на задание
Вот как будет выглядеть запрос:
SELECT
departments.department_name,
employees.name AS employee_name
FROM employees RIGHT JOIN departments
ON employees.department_id = departments.department_id;
Результат будет следующим:
| department_name | employee_name |
|---|---|
| IT | Peter |
| Продажи | Eva |
| Бухгалтерия | NULL |
Типичные ошибки при использовании RIGHT JOIN
Работая с RIGHT JOIN, новички часто сталкиваются с такими проблемами:
- Забывают про условие объединения
ON. Без указания условий вы получите декартово произведение таблиц, что может вызвать хаос. - Путают
RIGHT JOINиLEFT JOIN. Если вы используете таблицы не в том порядке, результат будет ошибочным. - Не обрабатывают
NULLзначения. В результате запросов сRIGHT JOINчасто появляютсяNULL, которые нужно правильно интерпретировать или заменить с помощьюCOALESCE().
На этом всё! Теперь вы знаете, как использовать RIGHT JOIN, понимаете разницу между RIGHT JOIN и LEFT JOIN, а также сможете выбрать правильный тип объединения для своих задач. В следующей лекции мы подробнее поговорим о FULL OUTER JOIN, где объединяем всё-всё из обеих таблиц. Удачи в ваших запросах!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ