В этом уроке мы рассмотрим полное внешнее соединение — 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. Оба они используются для объединения данных из двух таблиц, возвращая все строки из обеих таблиц, даже если нет совпадений.
Дополнительные материалы
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.