EXISTS и NOT EXISTS

Базовый SQL
≈ 1 мин чтения

EXISTS проверяет сам факт наличия строки

EXISTS не интересуется конкретным значением из подзапроса. Его вопрос проще: вернул ли внутренний запрос хотя бы одну строку?

SELECT u.id, u.name
FROM users AS u
WHERE EXISTS (
    SELECT 1
    FROM orders AS o
    WHERE o.user_id = u.id
);

Для каждого пользователя проверяется наличие хотя бы одного связанного заказа. Если такая строка существует, пользователь остаётся в результате.

NOT EXISTS проверяет отсутствие совпадения

SELECT u.id, u.name
FROM users AS u
WHERE NOT EXISTS (
    SELECT 1
    FROM orders AS o
    WHERE o.user_id = u.id
);

Теперь остаются пользователи, для которых внутренний запрос не нашёл ни одного заказа.

В EXISTS важен факт строки, а не выражение после SELECT. Поэтому часто пишут SELECT 1: это подчёркивает, что значения выбранных столбцов сами по себе не используются.