Gymterview
junior

Что делает оператор 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-значений в подзапросе.