SQL Exists运算符

在本教程中,您将学习如何使用SQL EXISTS运算符来测试子查询是否包含任何行。

1. SQL EXISTS运算符简介

EXISTS运算符用于指定子查询以测试行的存在。 以下是EXISTS运算符的语法:

EXISTS (subquery)

如果子查询包含任何行,则EXISTS运算符返回true。 否则它返回false

EXISTS运算符在找到行后立即终止查询处理,因此,可以利用EXISTS运算符的此功能来提高查询性能。

2. SQL EXISTS运算符示例

我们将使用示例数据库中的employeesdependents表进行演示。

《SQL Exists运算符》

以下语句查找至少有一个家属的所有员工:

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);

执行上面查询语句,得到以下结果:

《SQL Exists运算符》

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教程
        原文地址: https://www.yiibai.com/sql/sql-exists.html
        本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
    点赞