SQL EXISTS

摘要:在本教學中,您將學習如何使用 SQL 的 EXISTS 運算子來測試子查詢是否包含任何資料列。

SQL EXISTS 運算子介紹

EXISTS 運算子允許您指定一個子查詢來測試資料列是否存在。以下說明 EXISTS 運算子的語法:

EXISTS (subquery)
Code language: SQL (Structured Query Language) (sql)

如果子查詢包含任何資料列,EXISTS 運算子會傳回 true。否則,它會傳回 false。

EXISTS 運算子一旦找到資料列就會立即終止查詢處理,因此,您可以利用 EXISTS 運算子的此特性來提高查詢效能。

SQL EXISTS 運算子範例

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

SQL EXISTS - Sample Tables

以下語句會找出所有至少有一個受撫養人的員工:

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)
SQL EXISTS example

子查詢是相關的。對於 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 NOT EXISTS example

SQL EXISTS 和 NULL

如果子查詢傳回 NULLEXISTS 運算子仍然會傳回結果集。這是因為 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 運算子來測試子查詢是否傳回資料列。

這個教學對您有幫助嗎?