首页
学习
活动
专区
圈层
工具
发布
32 篇文章
1
《sql必知必会》——读书笔记(1)
2
《sql必知必会》——读书笔记(2)
3
《sql必知必会》——读书笔记(3)
4
《sql必知必会》——读书笔记(4)
5
《sql必知必会》——读书笔记(5)
6
MyBatis学习总结(一)——ORM概要与MyBatis快速入门
7
MyBatis学习总结(一)——ORM概要与MyBatis快速起步
8
MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射
9
MyBatis学习总结(三)——多表关联查询与动态SQL
10
MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射
11
MyBatis学习总结(四)——MyBatis缓存与代码生成
12
重学 Java 设计模式:实战工厂方法模式
13
重学 Java 设计模式:实战抽象工厂模式「替换Redis双集群升级,代理类抽象场景」
14
重学 Java 设计模式:实战建造者模式「各项装修物料组合套餐选配场景」
15
重学 Java 设计模式:实战原型模式「上机考试多套试,每人题目和答案乱序排列场景」
16
重学 Java 设计模式:实战单例模式「7种单例模式案例例模式」
17
重学 Java 设计模式:实战桥接模式「多支付渠道(微信)与多支付模式(刷脸、指纹)场景」
18
重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」
19
重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」
20
重学 Java 设计模式:实战命令模式「模拟高档餐厅八大菜系,小二点单厨师烹饪场景」
21
重学 Java 设计模式:实战迭代器模式「模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景」
22
重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」
23
重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」
24
重学 Java 设计模式:实战状态模式「模拟系统营销活动,状态流程审核发布上线场景」
25
重学 Java 设计模式:实战模版模式「模拟爬虫各类电商商品,生成营销推广海报场景」
26
重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」
27
《重学 Java 设计模式》PDF 出炉了 - 小傅哥,肝了50天写出18万字271页的实战编程资料
28
重学 Java 设计模式:实战适配器模式
29
重学 Java 设计模式:实战桥接模式
30
重学 Java 设计模式:实战组合模式
31
重学 Java 设计模式:实战外观模式
32
重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」

《sql必知必会》——读书笔记(2)

非关联子查询 和 关联子查询

子查询虽然是一种嵌套查询的形式,不过我们依然可以依据子查询是否执行多次,从而将子查询划分为关联子查询和非关联子查询。

子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做非关联子查询。同样,如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部,这种嵌套的执行方式就称为关联子查询。

非关联子查询例子:

代码语言:javascript
复制
SELECT player_name, height FROM player WHERE height = (SELECT max(height) FROM player)

关联子查询例子:

代码语言:javascript
复制
SELECT player_name, height, team_id FROM player AS a WHERE height > (SELECT avg(height) FROM player AS b WHERE a.team_id = b.team_id)

如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为关联子查询。比如我们想要查找每个球队中大于平均身高的球员有哪些,并显示他们的球员姓名、身高以及所在球队 ID。

IN 和 EXISTS 比较


既然 IN 和 EXISTS 都可以得到相同的结果,那么我们该使用 IN 还是 EXISTS 呢?

我们可以把这个模式抽象为:

代码语言:javascript
复制
SELECT * FROM A WHERE cc IN (SELECT cc FROM B)
代码语言:javascript
复制
SELECT * FROM A WHERE EXIST (SELECT cc FROM B WHERE B.cc=A.cc)

实际上在查询过程中,在我们对 cc 列建立索引的情况下,我们还需要判断表 A 和表 B 的大小。在这里例子当中,如果表 A 比表 B 大,那么 IN 子查询的效率要比 EXIST 子查询效率高,因为这时 B 表中如果对 cc 列进行了索引,那么 IN 子查询的效率就会比较高。

同样,如果表 A 比表 B 小,那么使用 EXISTS 子查询效率会更高,因为我们可以使用到 A 表中对 cc 列的索引,而不用从 B 中进行 cc 列的查询。

下一篇
举报
领券