Есть таблицы:
users
id | name
1 | Anna
2 | Boris
3 | Dima
orders
id | user_id
1 | 1
2 | NULL
Нужно найти пользователей, у которых нет заказов.
Кто-то пишет так:
SELECT *
FROM users
WHERE id NOT IN (
SELECT user_id
FROM orders
);
Ожидание:
Boris
Dima
Но результат может быть:
0 rows
Подвох в `NULL`.
Подзапрос возвращает:
1, NULL
А выражение:
id NOT IN (1, NULL)
превращается в логическую ловушку. SQL не может точно сказать, что
id не равен NULL, потому что NULL — это неизвестность.Правильнее так:
SELECT *
FROM users u
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.user_id = u.id
);
Правило: если в подзапросе может быть
NULL, осторожнее с NOT IN. Часто безопаснее использовать NOT EXISTS.