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

Что такое FULL OUTER JOIN?

1.0 Junior🔥 251 комментариев
#Базы данных (SQL)

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

FULL OUTER JOIN — полное объединение таблиц

FULL OUTER JOIN возвращает все строки из обеих таблиц, заполняя NULL для отсутствующих совпадений. Это мощный инструмент.

Основное определение

FULL OUTER JOIN = LEFT JOIN + RIGHT JOIN - дубликаты

Это означает:

  • Все строки из левой таблицы
  • Все строки из правой таблицы
  • NULL, где совпадений нет

Синтаксис

SELECT *
FROM table1
FULL OUTER JOIN table2
ON table1.id = table2.id;

Практический пример

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

INSERT INTO employees VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie');

CREATE TABLE projects (
    id INT PRIMARY KEY,
    employee_id INT,
    project_name VARCHAR(100)
);

INSERT INTO projects VALUES
(1, 1, 'Project A'),
(2, 1, 'Project B'),
(3, 2, 'Project C'),
(4, 4, 'Project D');

Результат FULL OUTER JOIN

SELECT 
    e.id as employee_id,
    e.name,
    p.id as project_id,
    p.project_name
FROM employees e
FULL OUTER JOIN projects p ON e.id = p.employee_id
ORDER BY e.id, p.id;

Результат:

  • employee_id=1, name=Alice, project_id=1, project_name=Project A
  • employee_id=1, name=Alice, project_id=2, project_name=Project B
  • employee_id=2, name=Bob, project_id=3, project_name=Project C
  • employee_id=3, name=Charlie, project_id=NULL, project_name=NULL
  • employee_id=NULL, name=NULL, project_id=4, project_name=Project D

Сравнение всех JOINов

INNER JOIN - только совпадения (3 строки) LEFT JOIN - все из левой таблицы + совпадения (4 строки) RIGHT JOIN - все из правой таблицы + совпадения (4 строки) FULL OUTER JOIN - всё (5 строк)

Когда использовать FULL OUTER JOIN

1. Поиск сирот в обе стороны

SELECT *
FROM employees e
FULL OUTER JOIN projects p ON e.id = p.employee_id
WHERE e.id IS NULL OR p.employee_id IS NULL;

Найдет сотрудников без проектов и проекты без сотрудников.

2. Аудит синхронизации двух систем

SELECT 
    COALESCE(system1.user_id, system2.user_id) as user_id,
    system1.name as name_system1,
    system2.name as name_system2
FROM system1_users system1
FULL OUTER JOIN system2_users system2
ON system1.user_id = system2.user_id
WHERE system1.name != system2.name
   OR system1.user_id IS NULL
   OR system2.user_id IS NULL;

3. Отчеты за все периоды

SELECT 
    COALESCE(plan.month, actual.month) as month,
    plan.planned_revenue,
    actual.actual_revenue
FROM planned_revenue plan
FULL OUTER JOIN actual_revenue actual
ON plan.month = actual.month
ORDER BY month;

Важные детали

При использовании FULL OUTER JOIN часто нужен COALESCE для получения ID:

SELECT COALESCE(e.id, p.employee_id) as id
FROM employees e
FULL OUTER JOIN projects p ON e.id = p.employee_id

Без COALESCE получишь NULL для некоторых строк.

Производительность

FULL OUTER JOIN может быть дорогостоящим для больших таблиц. Всегда используй EXPLAIN ANALYZE и убедись, что JOIN выполняется на индексированных полях.

Поддержка в разных БД

PostgreSQL - поддерживает Oracle - поддерживает SQL Server - поддерживает MySQL - НЕ поддерживает (нужно использовать UNION) SQLite - НЕ поддерживает (нужно использовать UNION)

Эмуляция FULL OUTER JOIN в MySQL

SELECT *
FROM employees e
LEFT JOIN projects p ON e.id = p.employee_id
UNION
SELECT *
FROM employees e
RIGHT JOIN projects p ON e.id = p.employee_id;

Заключение

FULL OUTER JOIN — это мощный инструмент для поиска неполных данных, сравнения двух таблиц и аудита синхронизации. Он может быть медленнее, чем INNER или LEFT JOIN, поэтому всегда профилируй запросы с помощью EXPLAIN ANALYZE.