在本教程中,将学习如何在条件中使用SQL Server EXISTS运算符来测试子查询中是否存在行。
SQL Server EXISTS运算符概述
EXISTS运算符是一个逻辑运算符,用于检查子查询是否返回任何行。 如果子查询返回一行或多行,则EXISTS运算符返回TRUE。
以下是SQL Server EXISTS运算符的语法:
EXISTS ( subquery)
在此语法中,子查询仅是SELECT语句。子查询返回行后,EXISTS运算符返回TRUE并立即停止处理。
请注意,即使子查询返回NULL值,EXISTS运算符也会计算为TRUE。
SQL Server EXISTS运算符示例
让我们举一些例子来了解EXISTS运算符的工作原理。
1. 带子查询的EXISTS返回NULL示例
请参阅示例数据库中的customers表。

以下示例返回customers表中的所有行:
SELECT
customer_id,
first_name,
last_name
FROM
sales.customers
WHERE
EXISTS (SELECT NULL)
ORDER BY
first_name,
last_name;
执行上面查询语句,得到以下结果:

在此示例中,子查询返回包含NULL的结果集,这也导致EXISTS运算符计算为TRUE。
1.2. EXISTS带有相关子查询示例
考虑以下customers和orders表,它们的结构如下所示:
以下示例查找已下过两个以上订单的所有客户:
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;
执行上面查询语句,得到以下结果:
在这个例子中,我们有一个相关的子查询,它返回下过两个以上订单的客户。
如果客户下达的订单数小于或等于2,则子查询返回一个空结果集,该结果集导致EXISTS运算符计算为FALSE。
根据EXISTS运算符的结果,客户是否包含在结果集中。
1.3. EXISTS 与 IN示例
以下语句使用IN运算符查找城市为San Jose的客户订单:
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;
执行上面查询语句,得到以下结果:
1.4. EXISTS与JOIN
JOIN子句从另一个表返回行记录,EXISTS运算符返回TRUE或FALSE。
可以使用EXISTS运算符来测试子查询是否返回行,并尽快进行短路。 另一方面,使用JOIN将结果集与另一个相关表中的列组合来扩展结果集。
