Короткий ответ
FULL JOIN сохраняет все строки из обеих таблиц независимо от того, нашлось ли совпадение, заполняя NULL там, где пары нет с любой стороны, — это полезно, например, при сверке двух источников данных, когда нужно увидеть записи, которые есть только в одном из них.
Как это работает подробнее
FULL JOIN можно представить как объединение результатов LEFT JOIN и RIGHT JOIN — ни одна строка ни из левой, ни из правой таблицы не теряется, даже если для неё нет пары на другой стороне.
Пример кода
question-35.sql
SELECT a.order_id AS crm_id, b.order_id AS billing_id
FROM crm_orders a
FULL JOIN billing_orders b ON a.order_id = b.order_id
WHERE a.order_id IS NULL OR b.order_id IS NULL;Что использовать на практике
- типичный сценарий — сверка данных из двух систем учёта (например, «заказы в CRM» и «заказы в биллинге»):
FULL JOINпо идентификатору заказа с последующей проверкойWHERE a.order_id IS NULL OR b.order_id IS NULLсразу покажет записи, которые есть только в одной из систем — это именно те случаи, которые нужно расследовать. Результат — заказы, расходящиеся между системами. Проверка: вручную найти один заказ из этого списка в обеих исходных таблицах и убедиться, что он действительно отсутствует в одной из них.
Подводные камни
- используют
FULL JOIN, когда на самом деле достаточноLEFT JOIN(то есть интересуют только «потери» с одной конкретной стороны) — это не ошибка по сути, но усложняет запрос без необходимости; забывают, что послеFULL JOINоба набора ключевых столбцов (a.order_idиb.order_id) нужно проверять наNULLотдельно, а не как единое поле.