学生看得明数据库图表,但一到写 SQL 就把 SELECT 与 WHERE 的内容倒转,聚合题又忘记 GROUP BY。这一堂把查询拆成“拣栏、筛列、分组、排序”四个固定位置。
本堂目标 学生能够:① 讲出资料表、记录、字段、主键的分别,并指出两表关联的字段;② 写出含 WHERE 条件的 SELECT,正确分辨“拣边几栏”与“筛边几行”;③ 用 COUNT、AVG、MAX 配合 GROUP BY 做聚合,并用 HAVING 筛分组结果;④ 在 5 分钟内对本堂 6 行样本表写出“4A 班平均分”查询(答案 77.0)。
01 先备知识(开课前 3 分钟快检)
以下任何一项未过关,本堂就会卡住,先补该项:
| 技能 |
快检题 |
过关标准 |
| 字段与记录 |
一行代表一个实体还是属性? |
答“一个实体” |
| 主键 |
学号可否作主键? |
答“可以,唯一且不为空” |
| 比较运算 |
WHERE mark >= 60 是筛栏还是筛行? |
答“筛行” |
02 课堂流程(60 分钟)
| 时间 |
环节 |
导师做什么 |
学生做什么 |
| 0–8 分 |
快检三题 |
抽问记录、主键、WHERE 作用 |
口头答,错即补 |
| 8–20 分 |
表结构 |
画出两表并标出关联字段 |
自行标主键 |
| 20–34 分 |
SELECT 与 WHERE |
示范拣栏与筛行,两者分开讲 |
改写三条查询 |
| 34–46 分 |
聚合与分组 |
COUNT、AVG 加 GROUP BY、HAVING |
写一条分组查询 |
| 46–56 分 |
限时实作 |
三条查询由浅到深 |
独立完成不查书 |
| 56–60 分 |
离场检查 |
按四个位置逐题问 |
自评并圈错处 |
03 讲解脚本(照着说就可以)
第一幕:一句 SELECT 只有四个位置
所有中学阶段的查询都可以拆成四格:SELECT 后面写“要显示边几栏”,FROM 写“边张表”,WHERE 写“只要边几行”,ORDER BY 写“点排”。学生最常把栏名写入 WHERE、把条件写入 SELECT。教的时候要求他们先读题目问“要显示什么”,把栏名圈起来,再读“只要符合什么条件”,把条件画线,两个圈分开之后才落笔写 SQL,错误率会即刻降。
每条题目先要学生讲“显示什么”与“条件是什么”两句,讲清才准写。
第二幕:筛行靠比较,字串要引号
WHERE 只做筛行,写法固定:数值直接比(mark >= 60),字串要加单引号(class = ‘4A’),日期用 YYYY-MM-DD 格式。多个条件用 AND/OR,AND 的优先级高于 OR,混用一定要加括号,否则“4A 或 4B 而及格”会被解读成完全不同的意思。若要用范围,BETWEEN 比连续两个比较清楚。示范时故意写一条没有括号的 OR 查询,让学生数出多出的行,印象会很深。
要求学生写完 WHERE 之后口头读一次“只要…而且…”,确认意思与题目一致。
第三幕:聚合:先分组,再计数,最后才筛
聚合函数一次只处理一组,所以 GROUP BY 是主角。以本堂样本表为例:6 行、及格 4 人,4A 班三人平均 77.0,最高分是 S03 的 91 分。要写“每班平均分”,就要 SELECT class, AVG(mark) FROM … GROUP BY class;要再筛“平均分高过 70 的班”,就用 HAVING 而不是 WHERE,因为 WHERE 在分组之前执行。这一句通常就是整题的关键分。
问学生“WHERE 同 HAVING 边个先跑”,答错即重讲执行次序。
04 必教题型与步骤
| 题型 |
例子 |
步骤 |
答案 |
| 单表筛选 |
列出符合条件的记录 |
圈栏名 → 写 WHERE → 检查引号 |
行数与条件一致 |
| 排序与限行 |
最高分的三人 |
ORDER BY mark DESC + LIMIT 3 |
排序方向正确 |
| 聚合 |
平均分、人数 |
选函数 → GROUP BY 分组栏 |
每组一行 |
| 关联查询 |
两表取资料 |
找出共同字段 → JOIN … ON |
关联字段对得上 |
合理性检查(一定要教):用样本表验算:6 行中及格 60 分以上有 4 人,所以 COUNT 应该回 4;4A 班三人(78、65、88)平均 77.0;全表最高分是 S03 的 91。学生交答案之后,最短的检查方法是把结果行数与自己数到的行数对比:若查询回 6 行而题目只要 4 行,通常是漏了 WHERE;若回 1 行而题目要每班一行,就是漏了 GROUP BY。
05 独立练习三题
| 题目 |
答案 |
想观察什么 |
| 列出所有及格学生的学号与姓名(≥60 分) |
4 行 |
有无写 WHERE mark >= 60 |
| 求 4A 班平均分 |
77.0 |
有无用 AVG + WHERE class |
| 每班最高分 |
4A:88、4B:91 |
有无 GROUP BY class 配 MAX |
06 学生常见错误与纠正句
| 错误 |
学生通常这样写 |
导师这样说 |
| SELECT 与 WHERE 倒转 |
SELECT class WHERE mark,把条件写入 SELECT |
“SELECT 拣栏,WHERE 筛行,你掉转了。” |
| 字串漏引号 |
WHERE class = 4A |
“4A 系字串,要加单引号,不加数据库会当他系栏名。” |
| 聚合漏 GROUP BY |
SELECT class, AVG(mark) 而无 GROUP BY |
“你要每班一行,就要先分组,不系只会得一行总平均。” |
| WHERE 当 HAVING 用 |
WHERE AVG(mark) > 70 |
“WHERE 在分组前跑,聚合结果要用 HAVING 筛。” |
07 家课建议(直接指到练习卷题号)
08 离场检查(最后 5 分钟)
| 题目 |
答案 |
判定 |
| 四个位置 |
SELECT/FROM/WHERE/ORDER BY |
讲不出:重教第一幕 |
| 筛行语法 |
数值直接比、字串加引号 |
漏引号即重写 |
| 聚合次序 |
WHERE → GROUP BY → HAVING |
倒转即回第三幕 |
09 导师常问
一定要用大写关键字吗?
SQL 不分大小写,但惯例大写关键字、小写栏名,考试时较易给分。
JOIN 一定要写 ON 吗?
要,ON 指定两表哪一栏相等,漏了就会变成笛卡儿积,行数暴增。
COUNT(*) 与 COUNT(栏名) 有分别吗?
有,COUNT(栏名) 不计 NULL,COUNT(*) 计所有行。
立即免费找导师导师登记 →
本页为 TutorZone 导师备课指引,内容由 TutorZone 团队编写;题目与流程为原创,并非任何学校或出版社的教材。