Авторский канал про Базы Данных и SQL
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!
Cотрудничество: @energy_c
РКН: https://clck.ru/3QREBc
Post #1593
2.15K
NULL и NOT IN — тонкость SQL, приводящая к логическим ошибкам!
При использовании
Представим таблицы:
Нужно найти клиентов, у которых нет заказов.
Интуитивный вариант:
Если подзапрос возвращает хотя бы одно значение
Это происходит потому, что
Попытка исправить ситуацию фильтрацией:
Формально запрос корректен, но требует постоянного контроля и легко ломается при изменении подзапроса.
Надёжный вариант — использовать
🔥 Используй
➡️ SQL Ready | #практика
При использовании
NOT IN в SQL можно получить логически неверный результат без ошибок выполнения. Причина — трёхзначная логика и наличие NULL в данных.Представим таблицы:
customers(id)
orders(id, customer_id)
Нужно найти клиентов, у которых нет заказов.
Интуитивный вариант:
SELECT id
FROM customers
WHERE id NOT IN (
SELECT customer_id
FROM orders
);
Если подзапрос возвращает хотя бы одно значение
NULL, результат этого запроса будет пустым, даже если клиенты без заказов существуют.Это происходит потому, что
NOT IN сводится к серии сравнений, а любое сравнение с NULL возвращает неопределённый результат.Попытка исправить ситуацию фильтрацией:
SELECT id
FROM customers
WHERE id NOT IN (
SELECT customer_id
FROM orders
WHERE customer_id IS NOT NULL
);
Формально запрос корректен, но требует постоянного контроля и легко ломается при изменении подзапроса.
Надёжный вариант — использовать
NOT EXISTS:SELECT c.id
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id
);
NOT EXISTS корректно обрабатывает NULL и предназначен именно для проверок отсутствия связанных строк.🔥 Используй
NOT EXISTS для анти-джойнов и проверок отсутствия данных, а NOT IN — только при полном контроле результата подзапроса.➡️ SQL Ready | #практика
- 👍 14
- ❤ 8
- 🤝 7













