FULL OUTER JOIN (полное внешнее соединение) - это самый инклюзивный тип соединения. Он возвращает все строки, если есть совпадение в любой из таблиц (левой или правой). По сути, это комбинация LEFT JOIN и RIGHT JOIN.
FULL OUTER JOIN создает результирующий набор, который включает абсолютно все записи из обеих таблиц.
Визуализация:
Таблица A (потенц. лиды) Таблица B (активные клиенты)
+----+----------+ +----+----------+
| id | имя | | id | статус |
+----+----------+ +----+----------+
| 1 | Алиса | <--------> | 1 | Активен | (Совпадение!)
| 2 | Боб | <--------? | NULL | (Только лид, еще нет аккаунта)
| NULL | <--------> | 3 | Активен | (Только клиент, нет в списке лидов)
+----+----------+ +----+----------+
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 нет оператора 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;