子查询
使用
1、一个查询语句嵌套在另一个查询语句内部的查询
2、子查询(内查询)在主查询之前一次执行完成
3、子查询的结果被主查询(外查询)使用
4、事项
(1)子查询要包含在括号内
(2)将子查询放在比较条件的右侧
(3)单行操作符对应单行子查询,多行操作符对应多行子查询
分类
1、方式一
(1)单行子查询:只返回一行数据的子查询语句
(2)多行子查询:返回多行数据的子查询,使用关键字 IN、DISTINCT 去重
2、方式二
(1)相关(关联)子查询:子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部
(2)不相关(非关联)子查询:子查询只执行一次
单行子查询
1、单行比较操作符
操作符 | 含义 |
= | 等于 |
>= | 大于等于 |
> | 大于 |
<= | 小于等于 |
< | 小于 |
<> | 不等于 |
2、类型
(1)WHERE 中的子查询
(2)HAVING 中的子查询
(3)CASE 中的子查询
3、顺序
(1)首先执行子查询
(2)向主查询中的 HAVING 子句返回结果
(3)把内层查询作外层查询的比较条件
4、事项
(1)空值情况:子查询不返回任何行
(2)非法使用子查询:多行子查询使用单行比较符
多行 / 集合比较子查询
1、内查询返回多行
2、多行比较操作符
操作符 | 含义 |
IN | 等于列表中的任意一个 |
ANY | 需要和单行比较操作符一起使用,和子查询返回的某一个值比较 |
ALL | 需要和单行比较操作符一起使用,和子查询返回的所有值比较 |
SOME | 实际上是 ANY 的别名,作用相同,一般常使用 ANY |
3、事项
(1)空值情况:子查询不返回任何行
(2)非法使用子查询:多行子查询使用单行比较符
相关 / 关联子查询
1、如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次
2、相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询
(1)从主查询中获取候选列
(2)子查询使用主查询的数据
(3)若满足子查询的条件,则返回该行
3、FROM 中的子查询
(1)内层查询结果作为临时表,供外层再次查询
(2)临时表必须定义别名
(3)子查询要用 () 引起来
(4)外层查询结果、WHERE 子句中,区分不同表的重名列:表名.列名,
4、ORDER BY 中的子查询
5、关联子查询通常和 EXISTS 操作符一起使用
(1)检查在子查询中是否存在满足条件的行
(2)如果在子查询中不存在满足条件的行:条件返回 FALSE,继续在子查询中查找
(3)如果在子查询中存在满足条件的行:不在子查询中继续查找,条件返回 TRUE
6、NOT EXISTS:表示如果不存在某种条件,则返回 TRUE,否则返回 FALSE;EXISTS:若存在某种条件,则返回 TRUE,否则返回 FALSE
7、应用
(1)相关更新:使用相关子查询,依据一个表中的数据,更新另一个表的数据
(2)相关删除:使用相关子查询,依据一个表中的数据,删除另一个表的数据
自连接、子查询
1、一般情况,建议使用自连接,在许多 DBMS 的处理过程中,对于自连接的处理速度,要比子查询快得多
2、理解
(1)子查询实际上是通过未知表进行查询后的条件判断
(2)自连接是通过已知的自身数据表进行条件判断,因此在大部分 DBMS 中都对自连接处理进行优化
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战