相关子查询要跑很多遍
括号里用到了外层的字段,就得等外面给值才能算。

重 点
外层表有多少行,括号里那句就跑多少遍,这是它和普通子查询的分水岭。
打个比方
像挨个点名,点到谁就翻一次花名册查这个人,一个人翻一次。
括号里用到了外层的字段,就得等外面给值才能算。

外层表有多少行,括号里那句就跑多少遍,这是它和普通子查询的分水岭。
像挨个点名,点到谁就翻一次花名册查这个人,一个人翻一次。
括号里写了外层表的字段,这就是相关子查询。

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

NOT IN 遇上含 NULL 的子查询结果时会一行都查不出来,这是经典的坑。
子查询结果里混进一个 NULL,NOT IN 会返回什么?
括号里能查出行就是真,查不出就是假。

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

| 写法 | 括号里查的是 |
|---|---|
| NOT IN | 他选过的所有课 |
| NOT EXISTS | 他选这门课的记录 |
遇上空值时 NOT EXISTS 比 NOT IN 稳,查不出记录就是查不出,不受 NULL 影响。
前面都在一条语句里做文章,最后讲怎么把两条结果并起来。

并起来的两条查询各查各的,互不干扰,只要求列数和类型对得上。
两条查询的列数不一样,UNION 会怎样?
上下两条查询的结果拼成一张表,重复行自动去掉。

参与合并的各条查询,列的数目和对应的类型都必须相同。
去重要多花一道工序,什么时候该用 UNION ALL?
分别查两个专业,再合成一个结果集。

这个例子用一句 OR 条件就能写完,UNION 的真正用武之地是查不同的表。
ORDER BY 要写在最后一条查询之后,它管的是并完之后的整个结果。
两条都带分组和聚合,照样能用 UNION 接起来。
