SQLLab
Подзапросы / CTEСредний

NOT EXISTS

Проверяет, что подзапрос НЕ возвращает ни одной строки. NULL-безопасная альтернатива NOT IN.

Синтаксис
SELECT ... WHERE NOT EXISTS (SELECT 1 FROM ... WHERE ...);

Объяснение

NOT EXISTS возвращает TRUE, если подзапрос не нашёл ни одной строки. В отличие от NOT IN, корректно работает даже если в результатах подзапроса встречается NULL — NOT IN в этом случае молча возвращает пустой результат целиком, а NOT EXISTS продолжает работать правильно. Типичный сценарий — «пользователи без заказов», «товары без отзывов» и подобные антисвязи.

Пример

-- Пользователи без заказов
SELECT * FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM orders o WHERE o.user_id = u.id
);