Вы ищете пользователей без заказов. Почему запрос SELECT u.user_id FROM users u WHERE u.user_id NOT IN (SELECT o.user_id FROM orders o) может вернуть 0 строк и какой подход безопаснее?

ANOT IN всегда корректен, проблема только в том, что он медленнее NOT EXISTS.
BНужно добавить ORDER BY в подзапрос, иначе NOT IN не работает.
CЕсли подзапрос возвращает хотя бы один NULL, то условие NOT IN может стать UNKNOWN для всех строк; безопаснее использовать NOT EXISTS с корреляцией o.user_id = u.user_id.
DНужно заменить NOT IN на !=, чтобы исключить NULL.
Правильный ответ. NOT EXISTS проверяет отсутствие связанных строк, а NOT IN чувствителен к NULL в списке значений.

Разбор

В трёхзначной логике SQL выражение x NOT IN (...) может стать UNKNOWN, если в списке есть NULL, даже когда явного совпадения нет. В WHERE это означает, что строка не пройдёт фильтр, и итог может оказаться пустым. NOT EXISTS формулирует задачу иначе: «нет ни одной строки, удовлетворяющей связи и условию», и поэтому гораздо надёжнее для анти-джойна.

Проверь себя · 1/3разбор после ответа
Что является практическим преимуществом разбиения сложного запроса на шаги через WITH по сравнению с несколькими вложенными подзапросами?
Тренировать SQL в Telegram

Ещё вопросы по теме «Подзапросы и CTE»