sql exists 和 not exists解读

在 SQL 中,EXISTSNOT 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 EXISTSEXISTS 相反,它用于检查子查询是否没有返回任何行。如果子查询没有返回任何行,那么 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 条件为真,该学生的名字就会被选出来。

注意事项

  • EXISTSNOT EXISTS 的子查询中,通常不需要选择特定的列,因为只关心子查询是否返回了行。因此,经常会在子查询中选择一个常量(如 SELECT 1)来简化查询。
  • 这两个关键字可以与任何有效的 SQL 子查询结合使用,而不仅仅是与 SELECT 语句结合。例如,它们也可以与 UPDATEDELETE 或其他 SQL 语句结合使用。
  • 由于 EXISTSNOT EXISTS 只关心子查询是否返回了行,而不关心返回了多少行或返回了哪些行,因此它们通常比使用 COUNT() 或其他聚合函数与子查询结合使用更加高效。
相关推荐
嵌入式×边缘AI:打怪升级日志2 分钟前
USB设备枚举过程详解:从插入到正常工作
开发语言·数据库·笔记
oMcLin2 分钟前
Ubuntu 22.04 系统通过 SSH 远程登录失败:如何解决 SSH 配置文件错误导致的登录问题
数据库·ubuntu·ssh
Hello.Reader17 分钟前
Flink SQL Gateway 把 Flink SQL 变成“多客户端并发可用”的统一服务入口
sql·flink·gateway
代码游侠18 分钟前
复习——SQLite3 数据库
linux·服务器·数据库·笔记·网络协议·sqlite
Hello.Reader18 分钟前
Flink OLAP Quickstart把 Flink 当成“秒级交互查询”的 OLAP 服务来用
数据库·sql·flink
点云SLAM9 小时前
BOOS库中Graph模块boost::edge_reverse_t和boost::vertex_color_t解读
数据库·edge·图论·bfs·dfs/拓扑排序·boost库、
尽兴-9 小时前
《深入剖析:全面理解 MySQL 的架构设计》
数据库·mysql·数据库架构设计·理解mysql架构
在风中的意志9 小时前
[数据库SQL] [leetcode] 2388. 将表中的空值更改为前一个值
数据库·sql·leetcode
梦幻通灵9 小时前
Mysql字段判空实用技巧
android·数据库·mysql
酸菜牛肉汤面11 小时前
23、varchar与char的区别
数据库