← Назад к вопросам

Как работает FULL JOIN?

2.3 Middle🔥 142 комментариев
#Базы данных

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает FULL JOIN в SQL

FULL JOIN (или FULL OUTER JOIN) — это тип соединения таблиц в SQL, который возвращает все строки из обеих объединяемых таблиц, независимо от наличия совпадений по ключу соединения. Если для строки из одной таблицы нет соответствующей строки в другой таблице, результат все равно будет включать эту строку, но с NULL значениями для столбцов из отсутствующей таблицы.

Основная логика операции

SELECT *
FROM Table_A
FULL JOIN Table_B
ON Table_A.key = Table_B.key;

Результат этого запроса состоит из трех логических частей:

  1. Внутреннее соединение: Все строки, где ключ из Table_A совпадает с ключом из Table_B.
  2. Левое внешнее соединение (LEFT JOIN): Все строки из Table_A, для которых нет совпадений в Table_B. Столбцы из Table_B заполняются NULL.
  3. Правое внешнее соединение (RIGHT JOIN): Все строки из Table_B, для которых нет совпадений в Table_A. Столбцы из Table_A заполняются NULL.

Пример с кодом и результатами

Рассмотрим две таблицы: Employees и Departments.

-- Создание и заполнение таблиц
CREATE TABLE Employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    department_id INT
);

CREATE TABLE Departments (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

INSERT INTO Employees VALUES (1, 'Анна', 10), (2, 'Борис', 20), (3, 'Света', NULL);
INSERT INTO Departments VALUES (10, 'Разработка'), (20, 'Маркетинг'), (30, 'Аналитика');

Выполним FULL JOIN:

SELECT
    E.name AS employee_name,
    D.name AS department_name
FROM Employees E
FULL JOIN Departments D
ON E.department_id = D.id;

Результат будет таким:

  • Анна | Разработка (совпадение)
  • Борис | Маркетинг (совпадение)
  • Света | NULL (сотрудник без департамента)
  • NULL | Аналитика (департамент без сотрудников)

Особенности и важные замечания

  • Стандарт SQL: FULL JOIN является частью стандарта SQL, но не все системы управления базами данных (СУБД) его поддерживают. Например, MySQL не поддерживает FULL JOIN напрямую. В MySQL его эмулируют через комбинацию LEFT JOIN и RIGHT JOIN с UNION.

    -- Эмуляция FULL JOIN в MySQL
    SELECT *
    FROM Table_A
    LEFT JOIN Table_B ON Table_A.key = Table_B.key
    UNION
    SELECT *
    FROM Table_A
    RIGHT JOIN Table_B ON Table_A.key = Table_B.key;
    
  • NULL значения: Критически важно понимать роль NULL в результатах FULL JOIN. Они указывают на отсутствие связи между таблицами. Это необходимо учитывать при фильтрации (WHERE) или агрегации (GROUP BY, COUNT) после соединения.

  • Ключ соединения (ON): Условие соединения в FULL JOIN определяет, какие строки считаются совпадающими. Если ключи не совпадают полностью (например, из-за различий в типах данных или NULL значений), это напрямую влияет на результат.

  • Отличие от других JOIN:

    *   **INNER JOIN**: Возвращает только совпадающие строки.
    *   **LEFT JOIN**: Возвращает все строки левой таблицы и совпадения из правой.
    *   **RIGHT JOIN**: Возвращает все строки правой таблицы и совпадения из левой.
    *   **FULL JOIN**: Симметричная операция, объединяющая принципы LEFT и RIGHT JOIN.

  • Применение: FULL JOIN полезен в задачах анализа, где необходимо увидеть полную картину данных из двух источников, включая "пробелы". Например:
    *   Сопоставление клиентов и заказов, чтобы увидеть всех клиентов (включая тех, кто не сделал заказ) и все заказы (включая те, где клиент не идентифицирован).
    *   Анализ соответствия товаров на складе и товаров в каталоге.

Таким образом, FULL JOIN — мощный инструмент для получения комбинированного и полного представления данных из двух таблиц, особенно когда важны как существующие связи, так и их отсутствие. Его использование требует внимательности к NULL значениям и поддержке конкретной СУБД.

Как работает FULL JOIN? | PrepBro