欢迎光临散文网 会员登陆 & 注册

【D1n910】(21/42) C++语言程序设计 - MySQL数据库学习笔记 2.5 子查询

2023-04-19 15:50 作者:爱交作业的D1N910  | 我要投稿

正常操作,正常分析,大家好,我是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!

未完待续!


【D1n910】(21/42) C++语言程序设计 - MySQL数据库学习笔记 2.5 子查询的评论 (共 条)

分享到微博请遵守国家法律