在本教學中,將學習如何在條件中使用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將結果集與另一個相關表中的列組合來擴展結果集。
