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