【D1n910】(21/42) C++语言程序设计 - MySQL数据库学习笔记 2.5 子查询
正常操作,正常分析,大家好,我是D1N910,这是我观看【MySQL数据库】C++语言程序设计 - MySQL数据库的学习笔记。

之前的笔记内容请看我的专栏。这里便不再累述了。

Unit11 子查询
Contents 目录
01、子查询的概念
02、where 子句中的子查询
03、from 子句中的子查询
01、子查询的概念
> 如果一个select语句嵌入到另一个SQL语句(例如select. insert、 update、delete语句)中,那么该select语句称为〞子查询〞,包含子查询的语句称为“主查询〞。
> 为了标记子查询和主查询之间的关系,通常将子查询写在小括号内。
> 子查询可以用在主查询的where子句、having子句、select子句或者from子句中。
02、where 子句中的子查询
1)单值
列出成绩低于平均分的信息
(1)查看平均分
条件表达式中可以使用比较运算符
示例:列出考试成绩低于平均分的信息,包括学号、课程号和成绩
【结果】
(2)列出成绩低于65的
上一条语句查询得到的平均分结果是 65.
把上一条语句的结果作为条件,进行检索,下面是直接书写
【结果】
(3)合并:
【结果】
和刚刚直接写 65 保持一致。
以上是子查询返回单指的场景。
2)多值
子查询返回多值
条件表达式中的运算符可以使用in、 not in等
示例:检索没有开设选修课的教师的信息
下面给出老师的表和课程表
•使用表连接
【结果】
• 使用子查询
【结果】
可以注意到,因为是返回多个值,所以我们要使用 in 或者 not in 这样能够从多个值里筛数据的。
现在我们这边看一个 not in 容易犯错的场景
我们目前的需求改为想通过 student 表找到 classes 表中没有学生的班级。
下面是两张表的信息
先举出错误例子,可以看到下面是查不出结果的。
之所以我们没有查出 class_no=6 的原因是因为 `select class_no from student;` 这条SQL预计查找出来的结果 有 NULL
通过前面的实验,我们知道 NULL 的比对无论如何都是没意义的
所以上面 6 与 NULL 的对比最终因为既不是 0 也不是 1,所以没输出了。
通过过滤掉 null,我们可以得到正确输出
以后注意 not in 注意 NULL 的问题
根据上面的原理,我们知道 in 不会有这样的问题。
03、from 子句中的子查询
from子句中的子查询
每一个select语句可以看成是一个虚拟的内存表,可以在结果集的基础上进行进一步的查询
示例
检索表的数量多于50的数据库的信息
上面的 db 是别名,这是必须要的,通过命名一个别名,以临时保存在内存中。否则外层会无法使用的。PS:这里 where cnt > 50; 使用的不能算是别名,是 db 这个表中的字段名!
下面是去掉别名后的报错信息
检索考试成绩比自己的平均分高的课程的信息,这里用了表连接的方式
【结果】

恭喜我们,掌握了数据库表的子查询
我们的学习进度为 21/42!
未完待续!