摘要:在本教程中,您将了解如何使用SQL EXISTS
运算符来测试子查询中是否包含任何行。
SQL EXISTS运算符简介
EXISTS
运算符允许您指定一个子查询来测试行的存在性。以下是EXISTS
运算符的语法说明:
EXISTS (subquery)
Code language: SQL (Structured Query Language) (sql)
如果子查询包含任何行,EXISTS
运算符将返回真。否则,它将返回假。
EXISTS
运算符一旦找到一行将会立即终止查询处理,因此,您可以利用EXISTS
运算符这一特性来提高查询性能。
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);
Code language: SQL (Structured Query Language) (sql)

子查询是关联的。对于 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 EXISTS和NULL
如果子查询返回NULL
,EXISTS
运算符仍然将返回结果集。这是因为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
运算符来测试子查询返回的行的存在性。
本教程是否有用?