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