数据库原理与应用 第 6 章 · 上机三
课程第 6 章上机三 对上号内连接三张表连了再分组左外连接交叉连接左右对调自连接连起来 版式
第 6 章 数据表中的数据查询 · 上机三

多表连接

八道题,从漏写连接条件的行数爆炸开始,做到自连接为止。
已完成 0 / 8
本 次 上 机 题 目
  1. 01两张表靠什么对上号
  2. 02同一件事的两种写法
  3. 03教师连授课再连课程
  4. 04连接之后接着分组统计
  5. 05把没授课的教师也找出来
  6. 06亲眼看一次行数相乘
  7. 07左连接和右连接是一回事
  8. 08一张表取两个别名
  9. 连续练习:五道连接题
01
第 6 章 · 上机三

两张表靠什么对上号

先看漏写连接条件会怎样,再补上条件。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲查询就行。回车执行,也可以用下面的按钮。
mysql>

重 点

第三条是八乘二十等于一百六十行,连接条件一补上就只剩二十行。

想一想

那一百四十行凭空多出来的记录,错在哪里?

02
第 6 章 · 上机三

同一件事的两种写法

逗号加 WHERE,和 INNER JOIN 加 ON,结果一模一样。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲查询就行。回车执行,也可以用下面的按钮。
mysql>

重 点

最后一条不加表名前缀,两张表都有 sno,机器报 1052 字段有歧义。

练一练

两张表都有 sno 字段时,SELECT 后面该怎么写?
  1. Asno
  2. Bs.sno 或 sc.sno
  3. C两个都写上
答案 B

加表名前缀说清楚要哪一张表的,不加机器无法判断。

03
第 6 章 · 上机三

教师连授课再连课程

教师和课程之间隔着授课表,得连两次。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲查询就行。回车执行,也可以用下面的按钮。
mysql>

重 点

三张表要写两个连接条件,少写一个行数立刻涨好几倍。

知道更多

结果里只有九行五位教师,张刚一门课都没排,所以他不在里面。

04
第 6 章 · 上机三

连接之后接着分组统计

先把课程名连过来,再按课程分组数人头。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲查询就行。回车执行,也可以用下面的按钮。
mysql>

重 点

分组字段里课程名也要写上,因为它出现在了 SELECT 后面。

想一想

为什么控制理论这门课一行都没出现?

05
第 6 章 · 上机三

把没授课的教师也找出来

内连接看不见张刚,左连接能把他捞出来。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲查询就行。回车执行,也可以用下面的按钮。
mysql>

重 点

两条一对比,第二条多出来的那一行课程名是 NULL,那就是没授课的人。

知道更多

找谁没干某件事,几乎都是左连接加上一句判断 NULL。

06
第 6 章 · 上机三

亲眼看一次行数相乘

不带条件的连接,行数是两边相乘,列数是两边相加。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲查询就行。回车执行,也可以用下面的按钮。
mysql>

重 点

六乘八是四十八,最后那条三张表全不加条件,一下就是一千多行。

想一想

程序跑出了远超预期的行数,第一个该怀疑的是什么?

07
第 6 章 · 上机三

左连接和右连接是一回事

把两张表的位置换过来,左连接就变成了右连接。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲查询就行。回车执行,也可以用下面的按钮。
mysql>

重 点

两条结果完全一样,何欣荣没选课,她那一行的课程号和成绩都是 NULL。

练一练

要保留左表全部的行,用哪一种连接?
  1. AINNER JOIN
  2. BLEFT JOIN
  3. CCROSS JOIN
答案 B

左连接以左表为主表,主表的行一个不少,右表配不上就补 NULL。

08
第 6 章 · 上机三

一张表取两个别名

要拿同一张表的两行比大小,就得先把它变成两张。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲查询就行。回车执行,也可以用下面的按钮。
mysql>

重 点

第二条把王彤自己也带出来了,第三条多加一句才把她排掉。

知道更多

自连接里每个字段都要带别名前缀,否则机器分不清是哪一份。

第 6 章 · 上机三

连续练习:五道连接题

不看上面的答案,自己把这五道连接题写出来。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲查询就行。回车执行,也可以用下面的按钮。
mysql>

重 点

第三条是找谁没选课的标准写法,左连接之后判断从表字段是不是 NULL。

知道更多

写不出来就回到讲义那几页,把对应的例题再敲一遍。

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