SQL Server EXISTS

В этом руководстве вы узнаете, как использовать оператор SQL Server EXISTS в условии для проверки существования строк в подзапросе.

Обзор оператора SQL Server EXISTS

Оператор EXISTS — это логический оператор, позволяющий проверить, возвращает ли подзапрос какую-либо строку. Оператор EXISTS возвращает TRUE, если подзапрос возвращает одну или несколько строк.

Ниже показан синтаксис оператора EXISTS SQL Server:

EXISTS( subquery)

В этом синтаксисе подзапрос представляет собой только оператор SELECT. Как только подзапрос возвращает строки, оператор EXISTS возвращает TRUE и немедленно останавливает обработку.

Обратите внимание, что даже если подзапрос возвращает значение NULL, оператор EXISTS все равно оценивается как TRUE.

Примеры оператора EXISTS SQL Server

Давайте рассмотрим несколько примеров, чтобы понять, как работает оператор EXISTS.

A) Пример использования EXISTS с подзапросом, возвращающим NULL

См. следующую таблицу клиентов из образца базы данных.

Следующий пример возвращает все строки из таблицы «Клиенты»:

SELECT
    customer_id,
    first_name,
    last_name
FROM
    sales.customers
WHERE
    EXISTS(SELECT NULL)
ORDER BY
    first_name,
    last_name;

SQL Server EXISTS с примером NULL

В этом примере подзапрос вернул набор результатов, содержащий NULL, что приводит к тому, что оператор EXISTS оценивается как TRUE. Таким образом, весь запрос возвращает все строки из таблицы customers.

B) Пример использования EXISTS с коррелированным подзапросом

Рассмотрим следующие таблицы клиентов и заказов:

В следующем примере находят всех клиентов, которые оформили более двух заказов:

SELECT
    customer_id,
    first_name,
    last_name
FROM
    sales.customers c
WHERE
    EXISTS(
        SELECT
            COUNT(*)
        FROM
            sales.orders o
        WHERE
            customer_id = c.customer_id
        GROUP BY
            customer_id
        HAVING
            COUNT(*) > 2
    )
ORDER BY
    first_name,
    last_name;

SQL Server EXISTS с примером коррелированного подзапроса

В этом примере у нас был коррелированный подзапрос, который возвращает клиентов, оформивших более двух заказов.

Если количество заказов, размещенных клиентом, меньше или равно двум, подзапрос возвращает пустой набор результатов, что приводит к тому, что оператор EXISTS оценивается как FALSE.

На основании результата оператора EXISTS клиент будет включен в набор результатов.

C) Пример EXISTS и IN

В следующем операторе оператор IN используется для поиска заказов клиентов из Сан-Хосе:

SELECT
    *
FROM
    sales.orders
WHERE
    customer_id IN(
        SELECT
            customer_id
        FROM
            sales.customers
        WHERE
            city = 'San Jose'
    )
ORDER BY
    customer_id,
    order_date;

В следующем операторе используется оператор EXISTS, который возвращает тот же результат:

SELECT
    *
FROM
    sales.orders o
WHERE
    EXISTS(
        SELECT
            customer_id
        FROM
            sales.customers c
        WHERE
            o.customer_id = c.customer_id
        AND city = 'San Jose'
    )
ORDER BY
    o.customer_id,
    order_date;

Пример SQL Server EXISTS и IN

EXISTS против JOIN

Оператор EXISTS возвращает TRUE или FALSE, а предложение JOIN возвращает строки из другой таблицы.

Вы используете оператор EXISTS, чтобы проверить, возвращает ли подзапрос какую-либо строку, и замыкаете, как только это происходит. С другой стороны, вы используете JOIN, чтобы расширить набор результатов, объединив его со столбцами из связанных таблиц.

На практике EXISTS используется, когда необходимо проверить существование строк в связанных таблицах, не возвращая данные из них.

В этом руководстве вы узнали, как использовать оператор EXISTS SQL Server для проверки того, возвращает ли подзапрос строки.

Мирослав С.

Автор статей, ИБ-специалист