JavaRush /Курсы /SQL SELF /`RIGHT JOIN` и его применение

`RIGHT JOIN` и его применение

SQL SELF
11 уровень , 3 лекция
Открыта

Давайте начнем с определения. RIGHT JOIN — это тип соединения, который возвращает все строки из правой таблицы (именно поэтому он называется "правый"), а из левой — только совпадающие строки. Если в левой таблице данных, соответствующих строке правой таблицы, нет — будут возвращены NULL значения для столбцов левой таблицы.

Вы уже знакомы с LEFT JOIN, это почти то же самое, но "зеркально". Основное отличие в том, какая таблица считается основной: левая или правая.

Синтаксис RIGHT JOIN

Синтаксис RIGHT JOIN практически идентичен LEFT JOIN. Вот его структура:

SELECT
    столбцы
FROM 
    таблица_левая RIGHT JOIN таблица_правая
ON 
    условие_объединения;

Обратите внимание на порядок таблиц:

  1. левая таблица пишется до RIGHT JOIN;
  2. правая таблица приводится после слова 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.

  1. Направление данных

    • LEFT JOIN: возвращает все строки из левой таблицы, независимо от того, есть ли совпадения в правой таблице.
    • RIGHT JOIN: возвращает все строки из правой таблицы, даже если совпадений в левой таблице нет.
  2. Выбор основной таблицы Обычно вы выбираете LEFT или RIGHT в зависимости от того, какая таблица (левая или правая) для вас важнее и в каком порядке удобнее писать запрос.

  3. Эквивалентность Любой 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, новички часто сталкиваются с такими проблемами:

  1. Забывают про условие объединения ON. Без указания условий вы получите декартово произведение таблиц, что может вызвать хаос.
  2. Путают RIGHT JOIN и LEFT JOIN. Если вы используете таблицы не в том порядке, результат будет ошибочным.
  3. Не обрабатывают NULL значения. В результате запросов с RIGHT JOIN часто появляются NULL, которые нужно правильно интерпретировать или заменить с помощью COALESCE().

На этом всё! Теперь вы знаете, как использовать RIGHT JOIN, понимаете разницу между RIGHT JOIN и LEFT JOIN, а также сможете выбрать правильный тип объединения для своих задач. В следующей лекции мы подробнее поговорим о FULL OUTER JOIN, где объединяем всё-всё из обеих таблиц. Удачи в ваших запросах!

2
Задача
SQL SELF, 11 уровень, 3 лекция
Недоступна
Простое использование `RIGHT JOIN`
Простое использование `RIGHT JOIN`
2
Задача
SQL SELF, 11 уровень, 3 лекция
Недоступна
Использование `RIGHT JOIN` с фильтрацией
Использование `RIGHT JOIN` с фильтрацией
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Alexandr Уровень 16
4 июля 2025
У вас есть таблицы: `employees` — список сотрудников, `departments` — список отделов. У вас есть таблицы: `employees` — список сотрудников, `departments` — список отделов. Напишите SQL-запрос с использованием `RIGHT JOIN`, чтобы получить список всех отделов и связанных с ними сотрудников. Добавьте условие, чтобы вернуть только те отделы, в которых нет сотрудников. Выведите столбцы: `department_name`, `name`. Вроде и мелочь ON departments.department_id = employees.department_id Но перед глазами нет таблицы и приходится гадать какие там атрибуты.
Иван Фетисов Уровень 4
11 июля 2025
Можно открыть init.sql там описана структура, также можно открыть начало курса и установить плагин