Что делает оператор EXISTS?
EXISTS принимает подзапрос в качестве аргумента и возвращает TRUE, если подзапрос возвращает хотя бы одну строку, и FALSE, если подзапрос не возвращает ни одной строки. В отличие от IN, оператор EXISTS не загружает весь результат подзапроса — он останавливается, как только найдена первая совпадающая строка, что делает его эффективным для больших наборов данных.
Пример
-- Найти пользователей, у которых есть хотя бы один заказ
SELECT u.name
FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id
);
-- Противоположное: пользователи без заказов
SELECT u.name
FROM users u
WHERE NOT EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id
);
EXISTS работает как коррелированный подзапрос — для каждой строки внешнего запроса выполняется внутренний подзапрос. Значение SELECT в подзапросе не имеет значения (обычно пишут SELECT 1 или SELECT *), поскольку EXISTS проверяет только факт наличия строк, а не их содержимое.
На собеседовании: важно объяснить, что
EXISTSостанавливается при первом совпадении и поэтому часто эффективнееIN. Частая ошибка — не знать разницу междуEXISTSиINпри наличииNULL-значений в подзапросе.