MySQL 视频课 · 50 集 / 多表查询练习与本章小结 / P48
第 48 集 / 共 50 · 多表查询练习与本章小结 · 视频 p=48 · 时长 17:42
P48 48. 基础-多表查询-练习1
看视频,对照阅读:在新标签打开原视频(p=48) · 先看跟播对照
这页是练习,题干按视频同主题重写,数据换成上面两张小表,不是原题逐字还原。四道题分别练隐式内连接、显式内连接 + 年龄过滤、有员工的部门、保留无部门员工。原课第 1 题是隐式连接、不带年龄条件;第 2 题是「年龄小于 30 岁」+ 显式内连接。本页题 2 把数字改成 age < 25,是本页自定的,别拿它和原题对答案。
复习模式:快速跳知识点(详解在下方各节)
复习顺序:先看“一句话理解”能否复述,再扫步骤,最后做自测;答不出时回到小例与易错。
一句话理解
把前几页连起来用:先判断“要哪些行”,再选内连接还是外连接,最后检查有没有重复、有没有漏掉无部门的人。
跟播:视频里 ↔ 本站
视频在「5.7 多表查询案例」上逐题写:第 1 题隐式、第 2 题显式 + age<30、第 3 题去重、第 4 题外连接。
| 视频里 / 原课字段 | 本站对应 |
|---|---|
| 讲义 emp 17 行 / dept 6 行 | 本站 employee 4 行 / department 3 行(原创小表) |
| emp.job、emp.entrydate | 本页小表没有这两列,题目里也不问 |
看完应能:看到「显式内连接 + 年龄过滤」能立刻写出 INNER JOIN … ON … WHERE age < 30
看视频时以讲义表为准,跟练时用本站表;结构相同、数字不同。
按这 3 步做
- 逐题先写“表 + 连接条件 + 过滤条件”三行草稿。表是 employee 和 department,连接条件是 e.dept_id = d.id,过滤条件才决定内连接还是外连接。
- 题目说“所有员工,没有部门也要”就选 LEFT JOIN;说“有员工的部门”就用内连接再去重。两类题的外连接方向相反,先抓关键词。
- 写完数行数对答案:4 名员工里 3 人有部门,3 个部门里 2 个有人。题1 和题2 都是内连接,区别是题2 多一个年龄过滤,所以题2 行数更少(1 行对 3 行);两题行集合不同,不能互相对照。
小例
-- 表:department(1 研发部, 2 测试部, 3 运营部)
-- employee:小林22/研发8000/上级2,小周25/研发10000/无上级,小陈30/测试12000/上级2,小李21/无部门/NULL/上级2
-- 建表与插入语句见本页练习脚本 p48.sql(独立练习库,跑一次就有这两张表)
-- 题1:所有员工及其部门(隐式内连接),3 行
SELECT e.name AS 员工, e.age AS 年龄, d.name AS 部门
FROM employee e, department d
WHERE e.dept_id = d.id
ORDER BY e.id;
-- 题2:年龄小于 25 的员工及其部门(显式内连接;25 是本页自定,原课是 age < 30),1 行
SELECT e.name AS 员工, e.age AS 年龄, d.name AS 部门
FROM employee e
INNER JOIN department d ON e.dept_id = d.id
WHERE e.age < 25
ORDER BY e.id;
-- 题3:有员工的部门(内连接 + 去重)
SELECT DISTINCT d.id, d.name
FROM employee e, department d
WHERE e.dept_id = d.id;
-- 题4:所有员工及其部门,没部门也要出现
SELECT e.name AS 员工, e.age AS 年龄, d.name AS 部门
FROM employee e
LEFT JOIN department d ON e.dept_id = d.id
ORDER BY e.id;
题1 是隐式内连接,4 名员工里只有 3 人有部门(小李 dept_id 为空,配不上),得到 3 行:小林、小周、小陈。题2 在本页是「显式内连接 + age < 25」:年龄小于 25 的有小林 22 和小李 21,小李没部门被内连接去掉,所以只剩 1 行小林——这就是题2 比题1 少的原因,两题行集合不同,不能互相对照。题3 得到 2 行:1 研发部、2 测试部;运营部没人所以不出现;DISTINCT 是因为研发部有两名员工,不去重会重复两行。题4 得到 4 行,小李的部门列是 NULL。 题2 里的 age < 25 是过滤员工,放在 WHERE;如果改成左连接再把它挪进 ON,年龄大的员工仍会出现,只是部门为 NULL,行数就多了。说明:题2 是本页自己的原创练习(显式内连接 + age < 25),不是视频原题逐字;原课第 2 题是「年龄小于 30 岁」+ 显式内连接(讲义 p85 第 2 题),第 1 题才是隐式连接且不带年龄条件,别混着对答案。
易错点
- 题3 忘了 DISTINCT,部门会按员工人数重复。
- 题4 “所有员工”却用了内连接,会漏掉小李且不报错。
- 把 e.age 之类的员工过滤写进 ON,左连接仍保留全部员工,含义容易混:连接条件放 ON,过滤员工放 WHERE。
30 秒速记
自测(3 题,先答再展开)
自测 1:为什么题3 要 DISTINCT?
研发部有两名员工,连接后部门行会重复;DISTINCT 按整行去重。
自测 2:题4 若把 LEFT 改成 INNER,结果几行?
3 行,小李因为 dept_id 为 NULL 被丢掉。
自测 3:题4 结果里小李的部门列是什么?
NULL;LEFT JOIN 保留了他,但 department 里没有对应行。
材料与来源
展开材料出处、讲义页码与证据等级
| 材料 | 类型 / 位置 | 支持了什么 |
|---|---|---|
| BV1Kr4y1i7ru P48(平台标题) | 平台视频页 · P48 | 静帧 t=212s 显示原课四道练习(隐式连接、显式连接、有员工的部门、外连接保留无部门员工);t=637s 为第3/4题答案区 |
| MySQL 8.0 Reference Manual — JOIN Clause | 官方文档 | 仅用于核对连接语义与错误码,不是课程材料 |
本集无逐字稿(匿名 player/v2 返回 subtitles=[]、need_login_subtitle=true),依据平台标题、讲义 p85–86「5.7 多表查询案例」与公开静帧核对,属主题级核实。示例表与数据为本笔记自建,不是课程原表;不含原始帧或字幕。 题干按同类题型重写;题2 用 age < 25 + 显式内连接,原课第 2 题是 age < 30 + 显式内连接,本页没有照抄原题。
讲义对照:讲义 5.7 多表查询案例(第 1–4 题所在段) · p85–86(公开镜像;按主题对应,切点 notexact)
- 画面静帧 9 帧,采样点 0:12–17:29 / 全片 17:42(只用于确认画面主题,不作内容边界)
- 原声字幕未取得:匿名接口字幕轨为空且需登录,未使用任何账号
等级含义:平台视频页 / 官方文档 / 课件 = 原始材料;二手整理 = 参考;推断 = 未经核实。站内补充的解释与练习会在此说明。