在本教程中,您将学习如何使用SQL EXISTS
运算符来测试子查询是否包含任何行。
1. SQL EXISTS运算符简介
EXISTS
运算符用于指定子查询以测试行的存在。 以下是EXISTS
运算符的语法:
EXISTS (subquery)
如果子查询包含任何行,则EXISTS
运算符返回true
。 否则它返回false
。
EXISTS
运算符在找到行后立即终止查询处理,因此,可以利用EXISTS
运算符的此功能来提高查询性能。
2. SQL EXISTS运算符示例
我们将使用示例数据库中的employees
和dependents
表进行演示。
以下语句查找至少有一个家属的所有员工:
SELECT
employee_id, first_name, last_name
FROM
employees
WHERE
EXISTS( SELECT
1
FROM
dependents
WHERE
dependents.employee_id = employees.employee_id);
执行上面查询语句,得到以下结果:
+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
| 100 | Steven | Lee |
| 101 | Neena | Wong |
| 102 | Lex | Liang |
| 103 | Alexander | Lee |
| 104 | Bruce | Wong |
| 105 | David | Liang |
| 106 | Valli | Chen |
... ...
| 176 | Jonathon | Yang |
| 200 | Jennifer | Zhao |
| 201 | Michael | Zhou |
| 202 | Pat | Zhou |
| 203 | Susan | Zhou |
| 204 | Hermann | Wu |
| 205 | Shelley | Wu |
| 206 | William | Wu |
+-------------+------------+-----------+
30 rows in set
子查询是相关的。 对于employees
表中的每一行,子查询检查dependents
表中是否有对应的行。 如果有匹配行,则子查询返回一个使外部查询包含employees
表中的当前行的子查询。 如果没有相应的行,则子查询不返回导致外部查询不包括结果集中employees
表中的当前行的行。
3. SQL NOT EXISTS
要取消EXISTS
运算符,可以使用NOT
运算符,如下所示:
NOT EXISTS (subquery)
例如,以下查询查找没有任何家属的员工:
SELECT
employee_id, first_name, last_name
FROM
employees
WHERE
NOT EXISTS( SELECT
1
FROM
dependents
WHERE
dependents.employee_id = employees.employee_id);
执行上面查询语句,得到以下结果:
4. SQL EXISTS和NULL
如果子查询返回NULL
,则EXISTS
运算符仍返回结果集。 这是因为EXISTS
运算符仅检查子查询返回的行的存在。 行是否为NULL
无关紧要。
在以下示例中,子查询返回NULL
,但EXISTS
运算符仍然计算为true
:
SELECT
employee_id, first_name, last_name
FROM
employees
WHERE
EXISTS( SELECT NULL)
ORDER BY first_name , last_name;
该查询返回employees
表中的所有行。
在本教程中,您学习了如何使用SQL EXISTS
运算符来测试子查询返回的行的存在。
上一篇:
SQL相关子查询
下一篇:
SQL All运算符