Урок 5.5: FULL OUTER JOIN - Объединение всех данных из обеих таблиц
FULL OUTER JOIN (полное внешнее соединение) - это самый инклюзивный тип соединения. Он возвращает все строки, если есть совпадение в любой из таблиц (левой или правой). По сути, это комбинация LEFT JOIN и RIGHT JOIN.
Что такое FULL OUTER JOIN?
FULL OUTER JOIN создает результирующий набор, который включает абсолютно все записи из обеих таблиц.
- Если строки совпадают, заполняются столбцы из обеих таблиц.
- Если в левой таблице есть строка без совпадения в правой, столбцы правой таблицы будут содержать NULL.
- Если в правой таблице есть строка без совпадения в левой, столбцы левой таблицы будут содержать NULL.
Визуализация:
Таблица A (потенц. лиды) Таблица B (активные клиенты)
+----+----------+ +----+----------+
| id | имя | | id | статус |
+----+----------+ +----+----------+
| 1 | Алиса | <--------> | 1 | Активен | (Совпадение!)
| 2 | Боб | <--------? | NULL | (Только лид, еще нет аккаунта)
| NULL | <--------> | 3 | Активен | (Только клиент, нет в списке лидов)
+----+----------+ +----+----------+
Синтаксис FULL OUTER JOIN
SELECT
table1.column1,
table2.column2
FROM
table1
FULL OUTER JOIN
table2 ON table1.common_column = table2.common_column;
Важное примечание о поддержке базами данных: Не все СУБД поддерживают
FULL OUTER JOINнапрямую.
- PostgreSQL, SQL Server и Oracle поддерживают его.
- MySQL и MariaDB НЕ поддерживают его.
Обходной путь для MySQL/MariaDB
Поскольку в MySQL нет оператора FULL OUTER JOIN, разработчики добиваются того же результата, объединяя LEFT JOIN и RIGHT JOIN с помощью оператора UNION:
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;
Практический пример
Представьте, что мы объединяем данные из двух разных филиалов. У Филиала А свой список клиентов, у Филиала Б - свой. Мы хотим получить полный список всех клиентов обоих филиалов, чтобы увидеть, где они пересекаются.
SELECT
a.customer_name AS branch_a_name,
b.customer_name AS branch_b_name
FROM
branch_a_customers AS a
FULL OUTER JOIN
branch_b_customers AS b ON a.customer_id = b.customer_id;
Ключевые выводы урока
- FULL OUTER JOIN возвращает все записи из обеих таблиц.
- Он использует NULL, чтобы заполнить пропуски там, где не найдено совпадений ни с одной из сторон.
- Это лучший инструмент для синхронизации баз данных и поиска расхождений между двумя списками.
- Если ваша БД его не поддерживает (как MySQL), используйте UNION для результатов LEFT и RIGHT соединений.