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