在本教學中,您將學習如何使用SQL EXISTS
運算子來測試子查詢是否包含任何行。
EXISTS
運算子用於指定子查詢以測試行的存在。 以下是EXISTS
運算子的語法:
EXISTS (subquery)
如果子查詢包含任何行,則EXISTS
運算子返回true
。 否則它返回false
。
EXISTS
運算子在找到行後立即終止查詢處理,因此,可以利用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);
執行上面查詢語句,得到以下結果:
+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
| 100 | Steven | Lee |
| 101 | Neena | Wong |
| 102 | Lex | Liang |
| 103 | Alexander | Lee |
| 104 | Bruce | Wong |
| 105 | David | Liang |
| 106 | Valli | Chen |
... ...
| 176 | Jonathon | Yang |
| 200 | Jennifer | Zhao |
| 201 | Michael | Zhou |
| 202 | Pat | Zhou |
| 203 | Susan | Zhou |
| 204 | Hermann | Wu |
| 205 | Shelley | Wu |
| 206 | William | Wu |
+-------------+------------+-----------+
30 rows in set
子查詢是相關的。 對於employees
表中的每一行,子查詢檢查dependents
表中是否有對應的行。 如果有匹配行,則子查詢返回一個使外部查詢包含employees
表中的當前行的子查詢。 如果沒有相應的行,則子查詢不返回導致外部查詢不包括結果集中employees
表中的當前行的行。
要取消EXISTS
運算子,可以使用NOT
運算子,如下所示:
NOT EXISTS (subquery)
例如,以下查詢查詢沒有任何家屬的員工:
SELECT
employee_id, first_name, last_name
FROM
employees
WHERE
NOT EXISTS( SELECT
1
FROM
dependents
WHERE
dependents.employee_id = employees.employee_id);
執行上面查詢語句,得到以下結果:
如果子查詢返回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;
該查詢返回employees
表中的所有行。
在本教學中,您學習了如何使用SQL EXISTS
運算子來測試子查詢返回的行的存在。