SQL EXISTS

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

SQL EXISTS运算符简介

EXISTS运算符允许您指定一个子查询来测试行的存在性。以下是EXISTS运算符的语法说明:

EXISTS (subquery)
Code language: SQL (Structured Query Language) (sql)

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

EXISTS运算符一旦找到一行将会立即终止查询处理,因此,您可以利用EXISTS运算符这一特性来提高查询性能。

SQL EXISTS运算符示例

在本演示中,我们将使用示例数据库中的 employeesdependents表格。

SQL EXISTS - Sample Tables

以下语句查找至少有一个受抚养人的所有员工

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)
SQL EXISTS example

子查询是关联的。对于 employees表格中的每一行,子查询都会检查dependents表格中是否存在相应的一行。如果存在,则子查询返回1,从而使得外部查询将 employees表格中的当前行包括在内。如果不存在相应的一行,则子查询不会返回任何行,这会导致外部查询不会将 employees表格中的当前行包括在结果集中。

SQL NOT EXISTS

要否定EXISTS运算符,您需要这样使用NOT运算符:

NOT EXISTS (subquery)
Code language: SQL (Structured Query Language) (sql)

例如,以下查询将查找没有任何受抚养人的员工

SELECT 
    employee_id, first_name, last_name
FROM
    employees
WHERE
    NOT EXISTS( SELECT 
            1
        FROM
            dependents
        WHERE
            dependents.employee_id = employees.employee_id);
Code language: SQL (Structured Query Language) (sql)

以下屏幕截图展示了结果

SQL NOT EXISTS example

SQL EXISTS和NULL

如果子查询返回NULLEXISTS运算符仍然将返回结果集。这是因为EXISTS运算符只检查子查询返回的行是否存在。该行是否为NULL并不重要。

在以下示例中,子查询返回NULL,但EXISTS运算符仍然求值为真

SELECT 
    employee_id, first_name, last_name
FROM
    employees
WHERE
    EXISTS( SELECT NULL)
ORDER BY first_name , last_name;    
Code language: SQL (Structured Query Language) (sql)

查询返回 employees表格中的所有行。

在本教程中,您已了解如何使用SQL EXISTS运算符来测试子查询返回的行的存在性。

本教程是否有用?