Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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.