SQL Exists運算子


在本教學中,您將學習如何使用SQL EXISTS運算子來測試子查詢是否包含任何行。

1. SQL EXISTS運算子簡介

EXISTS運算子用於指定子查詢以測試行的存在。 以下是EXISTS運算子的語法:

EXISTS (subquery)

如果子查詢包含任何行,則EXISTS運算子返回true。 否則它返回false

EXISTS運算子在找到行後立即終止查詢處理,因此,可以利用EXISTS運算子的此功能來提高查詢效能。

2. SQL EXISTS運算子範例

我們將使用範例資料庫中的employeesdependents表進行演示。

以下語句查詢至少有一個家屬的所有員工:

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表中的當前行的行。

3. SQL NOT EXISTS

要取消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);

執行上面查詢語句,得到以下結果:

4. 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;

該查詢返回employees表中的所有行。

在本教學中,您學習了如何使用SQL EXISTS運算子來測試子查詢返回的行的存在。