学生背得出“主键唯一”,但写 SELECT 时会漏 WHERE、把 COUNT 写成 COUNT(*),JOIN 更加直接放弃。这一堂把查询拆成四个零件,写错时知道是哪一个零件出事。
本堂目标 学生能够:① 指出主键与外键并解释参照完整性;② 由需求写出 SELECT … FROM … WHERE … ORDER BY 查询;③ 用 COUNT、AVG、GROUP BY 做统计,并用 JOIN 由两张表合成一张结果表。
01 先备知识(开课前 3 分钟快检)
以下任何一项未过关,本堂就会卡住,先补该项:
| 技能 |
快检题 |
过关标准 |
| 表格读法 |
一张表的栏叫什么 |
字段(field) |
| 排序概念 |
ORDER BY 预设是升序还是降序 |
升序 ASC |
| 平均数 |
5 个分数的平均怎样算 |
总和除以数量 |
02 课堂流程(60 分钟)
| 时间 |
环节 |
导师做什么 |
学生做什么 |
| 0–10 分 |
表、记录、字段 |
关联式数据库的基本单位 |
讲出三个名词的分别 |
| 10–22 分 |
主键与外键 |
唯一、非空、指向另一张表的主键 |
指出两张表的键 |
| 22–36 分 |
SELECT 四零件 |
SELECT、FROM、WHERE、ORDER BY |
写出筛选加排序 |
| 36–48 分 |
聚合与 GROUP BY |
COUNT、AVG、每组一行的意思 |
算出 4A 班 2 人 |
| 48–56 分 |
JOIN 与正规化 |
ON 条件配对、重复资料的危害 |
JOIN 后 5 行 |
| 56–60 分 |
离场检查 |
三题收回即批 |
独立完成 |
03 讲解脚本(照着说就可以)
第一幕:主键与外键:先画两张表,再讲规则
一张表由字段(field)与记录(record)组成。主键是能唯一识别一行的栏,所以不可以重复、不可以空白;外键是另一张表的主键,放在这张表用来表示“属于哪一个”。
本堂用两张表:Students(学号、姓名、班别、分数)共 5 笔记录,Classes(班别、班主任)共 3 笔。Students 的主键是学号,班别是外键,指向 Classes 的主键班别。所以 Students 里不可以出现 Classes 没有的班别,这条规则叫参照完整性。
要学生讲:如果把班主任姓名直接写入 Students,会有什么问题(同一位老师重复写多次,改一次要改好多行)。
第二幕:SELECT 四个零件:缺一件就错一种
SELECT 决定输出哪几个栏,FROM 决定由哪张表拿,WHERE 决定只要哪些行,ORDER BY 决定排序。四件零件各有各错,所以写错时先问“是筛选错、还是排序错”。
例:SELECT Name FROM Students WHERE ClassID = “4A” ORDER BY Name;结果是 2 行,Chan Tai Man 与 Lee Ka Yan,按姓名升序。
再加条件:WHERE Mark > 70 得 3 行;WHERE Mark > 70 AND ClassID = “4B” 得 1 行(Ng Yuk)。留意字串要用引号,数字不用。
要学生写:找出 4B 班分数最高的一位(Wong Hoi 58 与 Ng Yuk 90,答案是 Ng Yuk)。
第三幕:聚合与 JOIN:由几行变成一个数
COUNT 数行数、AVG 算平均、MAX 找最大,配合 GROUP BY 可以每组出一行。SELECT ClassID, COUNT(*) FROM Students GROUP BY ClassID;得 4A 2 人、4B 2 人、5A 1 人。
全班平均分 = (72 + 65 + 58 + 81 + 90) ÷ 5 = 73.2,最高分 90(Ng Yuk)。
JOIN 是把两张表按外键对齐:SELECT Students.Name, Classes.Teacher FROM Students JOIN Classes ON Students.ClassID = Classes.ClassID;结果仍然是 5 行,但每行多了班主任,Ms Cheung 带 2 人、Mr Lau 带 2 人、Dr Yip 带 1 人。
提醒:漏写 ON 条件会变成笛卡儿积,5 行乘 3 行得 15 行,是中六最常见的失分位。
04 必教题型与步骤
| 题型 |
例子 |
步骤 |
答案 |
| 设计 |
为补习班设计两张表 |
找唯一栏做主键、重复资料搬去另一张表 |
Students 加 Classes |
| 查询 |
列出 4A 班学生姓名,按分数由高到低 |
SELECT Name FROM Students WHERE ClassID = “4A” ORDER BY Mark DESC |
2 行 |
| 聚合 |
每班人数与平均分 |
GROUP BY ClassID 配 COUNT 与 AVG |
4A 2 人、4B 2 人、5A 1 人 |
| 解释 |
为何要正规化 |
消除重复、避免更新异常 |
改一处不用改多处 |
合理性检查(一定要教):查询结果行数一定不可以超过表的总行数 5,多过就是漏了 ON 条件。COUNT(*) 的答案一定是整数,出现 73.2 就是把 COUNT 与 AVG 混淆。平均分应该在最低分 58 与最高分 90 之间,超出范围就是加错行。
05 独立练习三题
| 题目 |
答案 |
想观察什么 |
| 4B 班人数 |
2 |
WHERE ClassID = “4B” 再 COUNT |
| 全表平均分 |
73.2 |
AVG(Mark) |
| JOIN 后行数 |
5 |
一对多但每名学生只属一班 |
06 学生常见错误与纠正句
| 错误 |
学生通常这样写 |
导师这样说 |
| 漏写 WHERE 就当已筛选 |
SELECT Name FROM Students 之后以为只有 4A |
“WHERE 系筛选,没有他就系全表。” |
| COUNT 与 AVG 混用 |
想数人数却写 AVG(*) |
“COUNT 数行,AVG 算平均,两个不可以调转。” |
| JOIN 漏 ON 条件 |
两表相乘得 15 行 |
“没有 ON 就系笛卡儿积,行数会爆。” |
| 把班主任姓名存入 Students |
同一老师名重复多次 |
“重复资料一改就要改好多行,所以拆表。” |
07 家课建议(直接指到练习卷题号)
08 离场检查(最后 5 分钟)
| 题目 |
答案 |
判定 |
| 4A 班人数 |
2 人 |
三题全对=可进正规化 |
| JOIN 后应有几行 |
5 行 |
答 15 就是漏 ON |
| 全表平均分 |
73.2 |
错两题以上=回到第二幕 |
09 导师常问
主键可以用姓名吗?
不理想。姓名会重复亦会改,通常用一个没有意思的学号或编号做主键。
GROUP BY 之后还可以用 WHERE 吗?
WHERE 在分组前筛选行,分组后要再筛选就用 HAVING,两者时序不同。
正规化是不是越多层越好?
不是。拆到第三正规化通常够用,拆得太散查询要不断 JOIN,读取变慢。
立即免费找导师导师登记 →
本页为 TutorZone 导师备课指引,内容由 TutorZone 团队编写;题目与流程为原创,并非任何学校或出版社的教材。