摘要:在本教程中,您将学习如何使用 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运算符取反。
测验 #
数据库 #
本教程是否有帮助?