TGViewer
Дима SQL-ит 🧑‍💻 (Аналитика данных, AI) Дима SQL-ит 🧑‍💻 (Аналитика данных, AI) @dima_sqlit · 2.22K subscribers
Post #35 1.38K
⚠️ SQL Ловушка: почему оператор NOT IN ломается, а EXISTS работает:

Рассмотрим классическую проблему с которой встречались многие.

📊 Пример данных:
Таблица orders:
order_id
--------
1
2
3
4


И таблица delivered_orders:
order_id
--------
1
2
NULL ← вот эта засада!


⭐️ Задача: Найти не доставленные заказы.

Почему оператор NOT IN в данном случае выдаст не верный результат:

Пишем запрос:
SELECT *
FROM orders
WHERE order_id NOT IN (SELECT order_id FROM delivered_orders);

Подзапрос вернет: (1, 2, NULL)

Итоговый результат - ПУСТАЯ ВЫБОРКА!

Почему сломалось? Давайте посмотрим на логику работы оператора not in для строки 3 в таблице orders:
1️⃣ 3 ≠ 1 AND 3 ≠ 2 AND 3 ≠ NULL
Переведем эти условия на булевую логику:
2️⃣3 ≠ 1 (True) AND 3 ≠ 2 (True) AND 3 ≠ NULL (UNKNOWN) → UNKNOWN (False)
То есть для любой строки условие не будет выполнено из-за NULL

✔️ Что делать, чтобы не допустить такой проблемы?

1️⃣Ответ - в подзапросе в условии where добавить is not null:
SELECT *
FROM orders
WHERE order_id NOT IN (SELECT order_id FROM delivered_orders where order_id is not null);

2️⃣Ответ - использовать оператор NOT EXISTS:
Пишем запрос:
SELECT *
FROM orders o
WHERE NOT EXISTS (
SELECT 1
FROM delivered_orders d
WHERE d.order_id = o.order_id
);

Сравнение выполняется построчно; запись с NULL не совпадает ни с одним order_id, поэтому итог снова 3 и 4 — без риска забыть фильтр IS NOT NULL.

Итог:
😎 Если эта инструкция вам помогла, то кидайте 🔥 или ❤️!
Встречались с такой проблемой и поняли как ее решить?
  • 🔥 21
  • ❤ 9
More from @dima_sqlit
  1. Sep 21, 2026ИИ сейчас развивается настолько быстро, что уследить за всем просто нереально: Каждый день…
  2. Sep 21, 2026🧠 Уровень абстракции — навык, который сэкономит вам годы учёбы: Когда я начинал изучать P…
  3. Sep 18, 2026🏦 Задача с собеса в Т-банк на SQL: вторая зарплата в отделе Условие: есть таблица сотрудн…
  4. Sep 16, 2026🏠 IT ипотека (Часть 3) — Как я сэкономил на ремонте: кэшбэк, промокоды и один неочевидный…
  5. Sep 7, 2026🍂 Осень — сезон найма: Каждый год одна и та же история — в сентябре рынок будто просыпает…
  6. Aug 24, 2026P-value простыми словами: Условие: подбросили монету 10 раз, выпало 9 орлов. Можно ли тепе…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →