摘要:在本教程中,您將學習如何使用 SQL EXISTS 運算子來測試子查詢是否返回任何行。
SQL EXISTS 運算子簡介 #
EXISTS 運算子允許您檢查子查詢是否返回任何行。如果子查詢返回至少一行,EXISTS 運算子返回 true,否則返回 false。
下面是 EXISTS 運算子的語法:
SELECT
column1,
column2
FROM
table_name
WHERE
EXISTS (subquery);Code language: SQL (Structured Query Language) (sql)在此語法中:
- 首先,指定
EXISTS運算子。 - 其次,在括號內放入您要檢查是否存在行的子查詢。
通常,您使用 EXISTS 運算子根據相關表中行的存在性來篩選主表中的行。子查詢通常是一個引用外部查詢中某列的相關子查詢。
EXISTS 運算子非常快,因為它在找到第一個匹配行時就會停止處理。
SQL EXISTS 運算子示例 #
我們將使用示例資料庫中的 employees 和 dependents 表進行演示。

以下語句使用 EXISTS 運算子查詢至少有一個受撫養人的員工:
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)輸出
employee_id | first_name | last_name
-------------+-------------+------------
100 | Steven | King
101 | Neena | Kochhar
102 | Lex | De Haan
103 | Alexander | Hunold
...Code language: SQL (Structured Query Language) (sql)查詢工作原理
對於 employees 表中的每一行:
- 子查詢檢查
dependents表中是否存在這樣一行,其employee_id列的值等於employees表當前行中employee_id列的值。 - 如果是,則表示當前員工至少有一個受撫養人。子查詢返回一個值為
1的行。EXISTS條件的計算結果為true。外部查詢將employees表的當前行包含在最終結果集中。 - 如果不是,則表示當前員工沒有受撫養人。子查詢不返回任何行。
EXISTS條件的計算結果為false。外部查詢不會將employees表的當前行包含在最終結果集中。
為了使查詢更簡潔,您可以為 employees 和 dependents 表使用表別名:
SELECT
employee_id,
first_name,
last_name
FROM
employees e
WHERE
EXISTS (
SELECT
1
FROM
dependents d
WHERE
d.employee_id = e.employee_id
);Code language: SQL (Structured Query Language) (sql)SQL NOT EXISTS 運算子 #
要對 EXISTS 運算子取反,您可以使用 NOT 運算子。如果子查詢不返回任何行,NOT EXISTS 返回 true,否則返回 false。
下面是 NOT EXISTS 運算子的語法:
SELECT
column1,
column2
FROM
table_name
WHERE
NOT EXISTS (subquery);Code language: SQL (Structured Query Language) (sql)例如,以下查詢使用 NOT EXISTS 運算子查詢沒有任何受撫養人的員工:
SELECT
employee_id,
first_name,
last_name
FROM
employees e
WHERE
NOT EXISTS (
SELECT
1
FROM
dependents d
WHERE
d.employee_id = e.employee_id
);Code language: SQL (Structured Query Language) (sql)輸出
employee_id | first_name | last_name
-------------+------------+-------------
120 | Matthew | Weiss
178 | Kimberely | Grant
193 | Britney | Everett
177 | Jack | Livingston
...Code language: SQL (Structured Query Language) (sql)SQL EXISTS 運算子與 NULL #
如果子查詢返回 NULL,EXISTS 運算子仍返回 true。原因是 EXISTS 運算子只檢查子查詢返回的行是否存在,而不管該行是否為 NULL。
例如,以下查詢將 EXISTS 運算子與一個返回 NULL 的子查詢一起使用:
SELECT
first_name,
last_name
FROM
employees
WHERE
EXISTS (
SELECT
NULL
);Code language: SQL (Structured Query Language) (sql)該查詢返回 employees 表中的所有行。
first_name | last_name
-------------+-------------
Steven | King
Neena | Kochhar
Lex | De Haan
Alexander | Hunold
...Code language: SQL (Structured Query Language) (sql)摘要 #
- 使用
EXISTS運算子測試子查詢返回的行是否存在。 - 使用
NOT運算子對EXISTS運算子取反。
測驗 #
資料庫 #
本教程是否有幫助?