RIGHT JOIN в SQL
Оператор RIGHT JOIN
— это противоположность LEFT JOIN
. Он возвращает строки из левой и правой таблиц, для которых выполняется условие объединения. Вот, как это выглядит на диаграмме Венна.
RIGHT JOIN
— это тип внешнего объединения, поэтому его также называют LEFT OUTER JOIN. Другие разновидности внешнего объединения — LEFT JOIN
и FULL JOIN
.
Примечание. При внешнем объединении в результате в любом случае будут какие-то строки, даже если между строками в двух объединяемых таблицах нет соответствия.
Давайте рассмотрим, как работает RIGHT JOIN
на примере. У нас есть две таблицы сотрудников employees
и отделов departments
.
Таблица employees |
Таблица departments |
+--------+--------------+------------+---------+ | emp_id | emp_name | hire_date | dept_id | +--------+--------------+------------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 4 | | 2 | Tony Montana | 2002-07-15 | 1 | | 3 | Sarah Connor | 2005-10-18 | 5 | | 4 | Rick Deckard | 2007-01-03 | 3 | | 5 | Martin Blank | 2008-06-24 | NULL | +--------+--------------+------------+---------+ |
+---------+------------------+ | dept_id | dept_name | +---------+------------------+ | 1 | Administration | | 2 | Customer Service | | 3 | Finance | | 4 | Human Resources | | 5 | Sales | +---------+------------------+ |
Допустим, нам нужно получить названия всех отделов и данные всех сотрудников, работающих в определенном отделе. Однако в реальной ситуации может быть такой отдел, в котором в настоящее время не работает ни один из сотрудников. Давайте найдем его.
Следующий оператор извлекает все доступные отделы, а также id, имя, дату приема на работу сотрудников, принадлежащих к этому отделу, путем объединения таблиц employees
и departments
по общему полю dept_id
.
SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name
FROM employees AS t1 RIGHT JOIN departments AS t2
ON t1.dept_id = t2.dept_id ORDER BY dept_name;
Примечание. Левой считается та таблица, которая стоит слева от оператор
JOIN
, а правая — та, которая находится справа от него.
После выполнения приведенной выше команды вы получите такой результат:
+--------+--------------+------------+------------------+ | emp_id | emp_name | hire_date | dept_name | +--------+--------------+------------+------------------+ | 2 | Tony Montana | 2002-07-15 | Administration | | NULL | NULL | NULL | Customer Service | | 4 | Rick Deckard | 2007-01-03 | Finance | | 1 | Ethan Hunt | 2001-05-01 | Human Resources | | 3 | Sarah Connor | 2005-10-18 | Sales | +--------+--------------+------------+------------------+
RIGHT JOIN
включает все строки из таблицы departments
в набор результатов, независимо от того, есть ли совпадение по столбцу dept_id
в таблице employees
, как вы можете видеть, отдел "Customer Service" включен, даже если в этом отделе нет ни одного сотрудника.
Примечание. Если есть строка в правой таблице, но нет совпадения в левой таблице, то связанная строка результата содержит значения
NULL
для всех столбцов, поступающих из левой таблицы.