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 运算符取反。

测验 #

数据库 #

本教程是否有帮助?
© .