SQL код скопирован в буфер обмена
Узнайте, как использовать SQL FULL OUTER JOIN для объединения всех записей из обеих таблиц (левой и правой). Этот урок охватывает концепцию полных наборов данных, обработку значений NULL с обеих сторон и распространенные обходные пути для баз данных, которые не поддерживают FULL OUTER JOIN нативно. Освойте продвинутые методы соединения для полной видимости данных.
EN PT

Урок 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 соединений.