SQL EXISTS

摘要:在本教程中,您將學習如何使用 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 運算子示例 #

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

SQL EXISTS - Sample Tables

以下語句使用 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 表的當前行包含在最終結果集中。

為了使查詢更簡潔,您可以為 employeesdependents 表使用表別名:

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 #

如果子查詢返回 NULLEXISTS 運算子仍返回 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 運算子取反。

測驗 #

資料庫 #

本教程是否有幫助?
© .