在本教程中,将学习如何在条件中使用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
将结果集与另一个相关表中的列组合来扩展结果集。