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

EXISTS / NOT EXISTS

Проверяет, возвращает ли подзапрос хотя бы одну строку. Более эффективен чем IN для больших данных.

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

Объяснение

EXISTS останавливается на первой найденной строке (short-circuit). IN читает все строки подзапроса. NOT EXISTS эффективнее NOT IN когда в подзапросе есть NULL: NOT IN с NULL всегда возвращает пустой результат.

Пример

-- Пользователи, сделавшие хотя бы один заказ
SELECT * FROM users u
WHERE EXISTS (
  SELECT 1 FROM orders o WHERE o.user_id = u.id
);

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