在 SQL 中,EXISTS
和 NOT EXISTS
是用于检查子查询是否返回任何行的条件语句。这两个关键字常用于与子查询结合,以基于子查询的结果来过滤主查询的结果。
EXISTS
EXISTS
子查询用于检查子查询是否返回至少一行。如果子查询返回至少一行,那么 EXISTS
条件为真,否则为假。
示例:
假设我们有两个表,一个是 students
(学生表),另一个是 courses
(课程表)。我们想要找出至少注册了一门课程的学生。
sql复制代码
|---|--------------------------------------|
| | SELECT student_name
|
| | FROM students s
|
| | WHERE EXISTS (
|
| | SELECT 1
|
| | FROM courses c
|
| | WHERE c.student_id = s.student_id
|
| | );
|
在这个例子中,对于 students
表中的每一行(即每一个学生),子查询都会检查 courses
表中是否存在与当前学生相关的行。如果存在,那么 EXISTS
条件为真,该学生的名字就会被选出来。
NOT EXISTS
NOT EXISTS
与 EXISTS
相反,它用于检查子查询是否没有返回任何行。如果子查询没有返回任何行,那么 NOT EXISTS
条件为真,否则为假。
示例:
假设我们想要找出没有注册任何课程的学生。
sql复制代码
|---|--------------------------------------|
| | SELECT student_name
|
| | FROM students s
|
| | WHERE NOT EXISTS (
|
| | SELECT 1
|
| | FROM courses c
|
| | WHERE c.student_id = s.student_id
|
| | );
|
在这个例子中,对于 students
表中的每一行(即每一个学生),子查询都会检查 courses
表中是否存在与当前学生相关的行。如果不存在,那么 NOT EXISTS
条件为真,该学生的名字就会被选出来。
注意事项
- 在
EXISTS
和NOT EXISTS
的子查询中,通常不需要选择特定的列,因为只关心子查询是否返回了行。因此,经常会在子查询中选择一个常量(如SELECT 1
)来简化查询。 - 这两个关键字可以与任何有效的 SQL 子查询结合使用,而不仅仅是与
SELECT
语句结合。例如,它们也可以与UPDATE
、DELETE
或其他 SQL 语句结合使用。 - 由于
EXISTS
和NOT EXISTS
只关心子查询是否返回了行,而不关心返回了多少行或返回了哪些行,因此它们通常比使用COUNT()
或其他聚合函数与子查询结合使用更加高效。