Найти в Дзене
Информатика

FULL OUTER JOIN: как запрос из пяти слов открывает дыры в данных, которые никто не замечает

Представь: ты аналитик в стартапе. Тебе говорят — «Сравни базу пользователей с базой заказов». Ты киваешь, идёшь к базе данных и через пять минут понимаешь, что реальность устроена неудобно. Часть пользователей никогда ничего не заказывала. Часть заказов висит без привязки к реальному человеку — призраки в системе. И вот тут обычный JOIN тебя подводит. Он покажет только тех, у кого всё сошлось. Аккуратно. Чисто. Неправдиво. Стандартный INNER JOIN — это как алгоритм рекомендаций в стриминге, который показывает только то, что точно зайдёт. Безопасно, предсказуемо, ~~и полная картина при этом теряется~~. LEFT JOIN лучше — он держит всё из левой таблицы, даже если пара не нашлась. Но правая сторона всё равно обрезается. RIGHT JOIN — зеркально наоборот. А теперь представь, что тебе нужно всё. Каждый пользователь. Каждый заказ. Совпало — отлично, покажи связь. Не совпало — покажи NULL и дай мне разобраться, почему. Вот это и есть FULL OUTER JOIN. Что он делает на самом деле SELECT
u.user
Оглавление
Реальность устроена неудобно
Реальность устроена неудобно

Представь: ты аналитик в стартапе. Тебе говорят — «Сравни базу пользователей с базой заказов». Ты киваешь, идёшь к базе данных и через пять минут понимаешь, что реальность устроена неудобно.

Часть пользователей никогда ничего не заказывала. Часть заказов висит без привязки к реальному человеку — призраки в системе. И вот тут обычный JOIN тебя подводит. Он покажет только тех, у кого всё сошлось. Аккуратно. Чисто. Неправдиво.

Почему JOIN врёт (ну, почти)

INNER JOIN показывает только пересечение
INNER JOIN показывает только пересечение

Стандартный INNER JOIN — это как алгоритм рекомендаций в стриминге, который показывает только то, что точно зайдёт. Безопасно, предсказуемо, ~~и полная картина при этом теряется~~.

LEFT JOIN лучше — он держит всё из левой таблицы, даже если пара не нашлась. Но правая сторона всё равно обрезается.

RIGHT JOIN — зеркально наоборот.

А теперь представь, что тебе нужно всё. Каждый пользователь. Каждый заказ. Совпало — отлично, покажи связь. Не совпало — покажи NULL и дай мне разобраться, почему.

Вот это и есть FULL OUTER JOIN.

рентген системы, видно всё
рентген системы, видно всё

Что он делает на самом деле

SELECT
u.user_name,
o.order_id,
CASE
WHEN o.order_id IS NULL THEN 'Пользователь без заказов'
WHEN u.user_id IS NULL THEN 'Заказ-призрак'
ELSE 'Всё ок'
END AS status
FROM users AS u
FULL OUTER JOIN orders AS o ON u.user_id = o.user_id;

Этот запрос — как рентген системы. Ты видишь всё: и здоровые связи, и дыры, и аномалии.

В реальных продуктах такие «дыры» — это потерянные деньги, баги в онбординге, битые данные от третьих сервисов. Финтех-компании буквально нанимают людей, которые умеют это находить.

Диаграмма Венна, которую стоит запомнить

фильтр только разницы
фильтр только разницы

Два круга. Левый — таблица А. Правый — таблица Б. Пересечение — строки, у которых нашлась пара.

  • INNER JOIN — только пересечение
  • LEFT JOIN — левый круг целиком
  • RIGHT JOIN — правый круг целиком
  • FULL OUTER JOIN — оба круга полностью

И когда нужно найти только несовпадения — добавляешь фильтр:

-- Только то, чего нет в другой таблице
WHERE u.user_id IS NULL OR o.order_id IS NULL

Теперь ты видишь не пересечение, а разницу. Именно так выглядит аудит данных в реальных системах.

Зачем это тебе прямо сейчас

контроль и проверка
контроль и проверка

Маркетплейс — FULL OUTER JOIN между каталогом поставщика и базой магазина, чтобы найти товары, которых нет с одной из сторон.

Онлайн-игра — сверка матчей и профилей, чтобы поймать баги в системе матчмейкинга.

Мессенджер — сравнение отправленных и доставленных сообщений, поиск потерянных.

SQL — это не про таблички. Это про контроль над информацией. Каждый цифровой продукт, которым ты пользуешься, работает на запросах вроде этого. Ты просто раньше этого не видел.

🔥 Хочешь копнуть глубже? Полный учебный материал с детальными примерами, схемами и крутыми иллюстрациями ждёт тебя на нашем сайте!