В этом руководстве вы узнаете, как использовать оператор 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;

В этом примере подзапрос вернул набор результатов, содержащий 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;

В этом примере у нас был коррелированный подзапрос, который возвращает клиентов, оформивших более двух заказов.
Если количество заказов, размещенных клиентом, меньше или равно двум, подзапрос возвращает пустой набор результатов, что приводит к тому, что оператор 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;

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




