数据库原理与应用 第 6 章 · 第六节
课程第 6 章第六节 跑很多遍相关子查询没选的人存在量词不存在最后一件并起来合并两批合并统计 版式
第 6 章 数据表中的数据查询 · 第六节

相关子查询与集合运算

子查询里引用外层的字段,以及用 UNION 把两个结果并起来。
本 节 知 识 点
  1. 59相关子查询要跑很多遍
  2. 60括号里出现了外层的表名
  3. 61把 IN 换成 NOT IN
  4. 62EXISTS 只回答有还是没有
  5. 63NOT EXISTS 找一个都没有的
  6. 64还剩集合运算
  7. 65UNION 把两个结果接起来
  8. 66两批学生并成一批
  9. 67带分组的查询也能并
59
第 6 章 · 第六节

相关子查询要跑很多遍

括号里用到了外层的字段,就得等外面给值才能算。

第 59 页课件

重 点

外层表有多少行,括号里那句就跑多少遍,这是它和普通子查询的分水岭。

打个比方

像挨个点名,点到谁就翻一次花名册查这个人,一个人翻一次。

60
第 6 章 · 第六节

括号里出现了外层的表名

括号里写了外层表的字段,这就是相关子查询。

第 60 页课件

重 点

判断办法很简单,把括号里那句单独拿出来跑,跑不通就是相关子查询。

打个比方

像查每个人的快递,得拿着这个人的手机号去查一次,换个人再查一次。

上机做

上机四第 7 题 对比两种子查询

61
第 6 章 · 第六节

把 IN 换成 NOT IN

问的是这门课不在他选的课里,答案就是没选的人。

第 61 页课件

重 点

NOT IN 遇上含 NULL 的子查询结果时会一行都查不出来,这是经典的坑。

想一想

子查询结果里混进一个 NULL,NOT IN 会返回什么?

62
第 6 章 · 第六节

EXISTS 只回答有还是没有

括号里能查出行就是真,查不出就是假。

第 62 页课件

重 点

EXISTS 括号里习惯写星号,因为它根本不看查出来的是什么,只看有没有。

知道更多它常常更快

机器一旦找到第一行就停手,不必把符合条件的行全部找完。

上机做

上机四第 8 题 EXISTS 怎么写

63
第 6 章 · 第六节

NOT EXISTS 找一个都没有的

括号里一行都查不出来时,这一行才留下。

第 63 页课件

分清楚三种写法查同一件事

写法括号里查的是
NOT IN他选过的所有课
NOT EXISTS他选这门课的记录

重 点

遇上空值时 NOT EXISTS 比 NOT IN 稳,查不出记录就是查不出,不受 NULL 影响。

64
第 6 章 · 第六节

还剩集合运算

前面都在一条语句里做文章,最后讲怎么把两条结果并起来。

第 64 页课件

重 点

并起来的两条查询各查各的,互不干扰,只要求列数和类型对得上。

想一想

两条查询的列数不一样,UNION 会怎样?

65
第 6 章 · 第六节

UNION 把两个结果接起来

上下两条查询的结果拼成一张表,重复行自动去掉。

第 65 页课件

试一试加不加 ALL 差在哪

写成
上句查计算机专业,下句查信息学院里不到 20 岁的,王彤两边都占。

重 点

参与合并的各条查询,列的数目和对应的类型都必须相同。

想一想

去重要多花一道工序,什么时候该用 UNION ALL?

66
第 6 章 · 第六节

两批学生并成一批

分别查两个专业,再合成一个结果集。

第 66 页课件

重 点

这个例子用一句 OR 条件就能写完,UNION 的真正用武之地是查不同的表。

知道更多排序只能写一次

ORDER BY 要写在最后一条查询之后,它管的是并完之后的整个结果。

67
第 6 章 · 第六节

带分组的查询也能并

两条都带分组和聚合,照样能用 UNION 接起来。

第 67 页课件

重 点

两条查询各自分组各自统计,UNION 只负责把两张小结果表摞起来。

知道更多表头看第一条

并起来之后的表头一律取第一条查询的,后面几条起的别名不算数。

上机做

上机四第 9 题 把两批统计并起来

保山学院·人工智能教研室·曹鼎鼎