В этом уроке мы рассмотрим полное внешнее соединение — FULL OUTER JOIN
или сокращенно FULL JOIN
. Результат этого соединения содержит все строки из обеих таблиц:
- Все пары строк, которые удовлетворяют условию соединения — как в
INNER JOIN
- Все строки без пары из первой таблицы
- Все строки без пары из второй таблицы
Применяем FULL JOIN
Пусть в базе данных хранится информация о сотрудниках и отделах. Наша задача — построить отчет, в котором будет указано, в каком отделе работает каждый из сотрудников.
Если есть отделы без сотрудников или сотрудники без отдела, то они тоже должны быть в отчете.
Рассмотрим структуру таблиц.
Таблица departments
содержит информацию об отделах:
departments
department_id | name |
---|---|
1 | Development Department |
2 | Marketing Department |
3 | Finance Department |
4 | HR Department |
5 | Sales Department |
Таблица employees
содержит информацию о сотрудниках:
employees
employee_id | department_id | name | salary |
---|---|---|---|
1 | 1 | John Smith | 50000.00 |
2 | 1 | Peter Johnson | 60000.00 |
3 | 2 | Mary Brown | 55000.00 |
4 | 2 | Alex Miller | 70000.00 |
5 | 3 | Helen White | 48000.00 |
6 | NULL | Adam Smith | 10000.00 |
View on DB Fiddle
В данных есть отделы без сотрудников и сотрудники без отделов. Бизнес логика и схема базы данных допускают такие записи.
Выполним полное внешнее соединение этих таблиц по условию departments.department_id = employees.department_id
:
SELECT
dep.name as department,
emp.name as employee
FROM departments AS dep
FULL JOIN employees AS emp ON
dep.department_id = emp.department_id;
Результат выполнения запроса:
department | employee |
---|---|
Development Department | John Smith |
Development Department | Peter Johnson |
Marketing Department | Mary Brown |
Marketing Department | Alex Miller |
Finance Department | Helen White |
NULL | Adam Smith |
Sales Department | NULL |
HR Department | NULL |
View on DB Fiddle
Результат содержит всех сотрудников с отделами, все отделы без сотрудников и всех сотрудников без отделов.
Схематично работа FULL JOIN
выглядит так:
В результат соединения попадают все пары строк, которые удовлетворяют условию соединения. Также туда попадают все строки без пары из первой (левой) таблицы и все строки без пары из второй (правой) таблицы.
Выводы
Полное внешнее соединение используют, когда в результате должны быть все строки из обеих таблиц, даже если у них нет подходящей пары. Результат FULL JOIN
включает в себя результаты INNER JOIN
, LEFT JOIN
и RIGHT JOIN
.
FULL OUTER JOIN
и FULL JOIN
обозначают одно и то же действие в SQL. Оба они используются для объединения данных из двух таблиц, возвращая все строки из обеих таблиц, даже если нет совпадений.
Дополнительные материалы
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.