摘要:在本教學中,您將學習如何使用 SQL 的 EXISTS
運算子來測試子查詢是否包含任何資料列。
SQL EXISTS
運算子介紹
EXISTS
運算子允許您指定一個子查詢來測試資料列是否存在。以下說明 EXISTS
運算子的語法:
EXISTS (subquery)
Code language: SQL (Structured Query Language) (sql)
如果子查詢包含任何資料列,EXISTS
運算子會傳回 true。否則,它會傳回 false。
EXISTS
運算子一旦找到資料列就會立即終止查詢處理,因此,您可以利用 EXISTS
運算子的此特性來提高查詢效能。
SQL EXISTS 運算子範例
我們將使用範例資料庫中的 employees
和 dependents
資料表來進行示範。

以下語句會找出所有至少有一個受撫養人的員工:
SELECT
employee_id, first_name, last_name
FROM
employees
WHERE
EXISTS( SELECT
1
FROM
dependents
WHERE
dependents.employee_id = employees.employee_id);
Code language: SQL (Structured Query Language) (sql)

子查詢是相關的。對於 employees
資料表中的每一列,子查詢會檢查 dependents
資料表中是否有對應的列。如果有,則子查詢會傳回一個值,使外部查詢將 employees
資料表中的當前列包含在內。如果沒有對應的列,則子查詢不會傳回任何列,導致外部查詢不會將 employees
資料表中的當前列包含在結果集中。
SQL NOT EXISTS
要否定 EXISTS
運算子,您可以使用 NOT
運算子,如下所示:
NOT EXISTS (subquery)
Code language: SQL (Structured Query Language) (sql)
例如,以下查詢會找出沒有任何受撫養人的員工:
SELECT
employee_id, first_name, last_name
FROM
employees
WHERE
NOT EXISTS( SELECT
1
FROM
dependents
WHERE
dependents.employee_id = employees.employee_id);
Code language: SQL (Structured Query Language) (sql)
以下螢幕截圖顯示結果:

SQL EXISTS 和 NULL
如果子查詢傳回 NULL
,EXISTS
運算子仍然會傳回結果集。這是因為 EXISTS
運算子只檢查子查詢是否傳回資料列。資料列是否為 NULL
並不重要。
在以下範例中,子查詢傳回 NULL
,但 EXISTS
運算子仍然評估為 true:
SELECT
employee_id, first_name, last_name
FROM
employees
WHERE
EXISTS( SELECT NULL)
ORDER BY first_name , last_name;
Code language: SQL (Structured Query Language) (sql)
此查詢會傳回 employees
資料表中的所有列。
在本教學中,您學習了如何使用 SQL EXISTS
運算子來測試子查詢是否傳回資料列。
這個教學對您有幫助嗎?