Подзапросы / 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
);