💡 课堂例题

第 5 章 · 数据查询 · 共 6 题 · 全部基于「教学实例」库:student / course / sc / teacher / grades · 代码可一键复制

1
基础 + 条件查询组合
查 03 班、年龄小于 17 的女生姓名与籍贯。
sql
SELECT Sname, sbirthplace
FROM student
WHERE class='03' AND sage<17 AND Ssex='女';
多个条件用 AND 串联,全部满足才返回。字段只取需要的,比 SELECT * 更规范。
2
聚合 + 分组实战
统计每个班级的人数与平均年龄。
sql
SELECT class 班级, COUNT(*) 人数, ROUND(AVG(sage),1) 平均 age
FROM student
GROUP BY class;
GROUP BY class 后,COUNT/AVG 在每个班内部各自计算。ROUND 控制小数位,输出更干净。
3
HAVING 过滤分组
找出"平均分高于全校数学平均分"的班级。
sql
SELECT st.class 班级, AVG(sc.score) 班平均分
FROM student st
JOIN sc ON st.Sno=sc.Sno
JOIN course c ON sc.Cno=c.Cno
WHERE c.Cname='数学'
GROUP BY st.class
HAVING AVG(sc.score) > (
  SELECT AVG(score) FROM sc
  JOIN course c ON sc.Cno=c.Cno
  WHERE c.Cname='数学');
HAVING 里用了标量子查询当门槛,这是"分组后过滤 + 子查询"的综合用法。
4
多表内连接
列出每位老师任教的课程及对应学生成绩。
sql
SELECT t.Tname 教师, c.Cname 课程, st.Sname 学生, sc.score 成绩
FROM teacher t
JOIN course c ON t.Tno=c.Tno
JOIN sc ON c.Cno=sc.Cno
JOIN student st ON sc.Sno=st.Sno
ORDER BY t.Tno;
四张表用主键外键串起来,是教学实例库最核心的查询范式。n 张表连接至少需要 n-1 个条件。
5
CASE 给成绩打等级
结合 grades 等级区间,给 sc 表每条成绩加"等级"列。
sql
SELECT st.Sname, sc.score,
  CASE
    WHEN sc.score>=90 THEN '优秀'
    WHEN sc.score>=75 THEN '良好'
    WHEN sc.score>=60 THEN '及格'
    ELSE '不及格' END 等级
FROM sc JOIN student st ON sc.Sno=st.Sno
ORDER BY sc.score DESC;
CASE 多分支最清晰,比嵌套 IF 可读性高。区间判断务必"从高往低"写,避免 85 分被前面的条件误判。
6
分页取前 N 名
按成绩降序,取总分最高的前 5 名学生。
sql
SELECT st.Sname, SUM(sc.score) 总分
FROM student st
JOIN sc ON st.Sno=sc.Sno
GROUP BY st.Sno
ORDER BY 总分 DESC
LIMIT 0, 5;
先 GROUP BY 算总分,再 ORDER BY 总分 DESC,最后 LIMIT 0,5 取前五。分页的"起始位置"从 0 算起。