【D1n910】(15/42) C++语言程序设计 - MySQL数据库学习笔记 表连接
正常操作,正常分析,大家好,我是D1N910,这是我观看【MySQL数据库】C++语言程序设计 - MySQL数据库从而整理的学习笔记。我会继续努力的。
本篇 D1n910】(13/42)学习【MySQL数据库】C++语言程序设计 - MySQL数据库的笔记
的主要内容是 表连接!多张表的数据展示!

如果你没看过之前的专栏内容,那么强烈建议一定要先看看再继续往下看





Unit08 表连接
表连接的类型
内连接
外连接
有关于表连接的需求需求:列出学生的信息,包括学号、姓名和班级名称
student: student_no、student_name
classes: class_name
数据在两个不同的表,那么就需要把两个表变成一个大表,然后从这个大表中进行数据的检索。
1.表连接的类型
· 内连接
符合关联条件的记录被检索出来,不符合条件的被过滤掉
· 外连接
外连接的结果集 = 内连接的结果集 + 匹配不上的记录
2.内连接
语法
> select 字段列表
示例
》列出学生及其所在班级的信息,包括学号、姓名和班级名称
inner 可写可不写
》向班级表和学生表中分别插入测试数据,再次执行查询语句
可以看出刚刚新插入的测试输入,其中张三丰是没有绑定班级的
再次执行查询语句发现没有查出
匹配不上的数据不会出现在结果集中,只有使得连接成立的才会出现在结果集中。
*表的别名
刚才我们学习过表头的别名,这里我们还可以弄表的别名,刚刚说过inner可以省略,那么我们这里省略,然后和表头一样,表名空格然后名字。
下面可以看出信息是和刚刚保持一致的
备注1:表名起别名后,不能再用原表名了,否则会报错。
备注2:若表A中的字段名在表B中未出现,则可省略表A名or表A别名。表B同理。
执行结果
不过不太建议,因为如果没有指定表名的话,会所有的表都找,导致效率低。
三表内连接(后面4表、5表都一样的)
语法
直接用join进行连接即可。
关联条件的数量是连接条件的数量 - 1。超过两张表以后,表的关联条件不是完全无需的。至少要和前面出现的表有关系。
回忆我们数据库模型图,想要测试三表连接的例子,那么肯定要用上 choose 表。

这里插入的时候可能会遇到报错,我自己碰到以下两种
1、choose 有外键限制,如果插入的数据对应主表的数据不一致,那么就插入失败;
2、插入时的内容不是时间格式或者有其他错误,也会插入失败,注意细节。
按照老师的视频,在把一些之前的表清理后,目前有七个表。
根据我们之前的数据库模型图,我们一共有三种不同的三表。
couse、choose和student
couse、choose和teacher
student、choose和teacher

现在用 couse、choose和student 这三张表
任务:列出学生及其选课的信息,包括学号、姓名、选修的课程名和成绩
student: student_no、student_name
choose: score
course: course_name
关联条件1: student.student_no = choose.student_no
关联条件2: course.course_no = choose.course_no
1.写出框架
2.写上表以及关系(注意顺序)
3.写上表名
运行结果
* 如果学生没有选任何一门课,那么就不会在结果中出现
3.外连接
类型
>左外连接
左外连接的结果集 = 内连接的结果集 + 左表中匹配不上的记录
> 右外连接
右外连接的结果集 =内连接的结果集 +右表中匹配不上的记录
语法
>左外连接
>右外连接
注意1:outer 可以省略。
注意2:和内连接不同,这里的 join 左右两张表的顺序会影响结果。
任务1 :左连接示例,列出全部学生的学号、姓名和所在班级名称(没有班级的学生也列出)
student: student_no, student_name
classes: class_name
关联条件:s.class_no == c.class_no;
SQL语句
运行结果,匹配不上班级的张三丰也出来了,只是班级名称用 NULL 填上
任务2:右连接示例,列出全部班级的学生学号、姓名和所在班级名称(没有学生的班级也列出)
student: student_no, student_name
classes: class_name
关联条件:s.class_no == c.class_no;
SQL语句
运行结果,匹配不上学生的2018电子信息1班也出来了,只是学号和姓名用 NULL 填上

恭喜你,掌握了数据库表的设计
你的学习进度为 15/42!
未完待续!