10. 流程控制函数(IF / CASE)
查询时也能做"判断",常用于给成绩打等级、行列转换:
sql
-- IF:双分支,及格/不及格
SELECT Sname, score,
IF(score>=60,'及格','不及格') 是否及格
FROM sc;
-- CASE:多分支,按 grades 表区间打等级
SELECT Sname, score,
CASE
WHEN score>=90 THEN '优秀'
WHEN score>=75 THEN '良好'
WHEN score>=60 THEN '及格'
ELSE '不及格' END 等级
FROM sc;CASE 还能做"行列转换",例如每个班级一行、男女各成一列:
sql
SELECT class 班级,
SUM(CASE WHEN Ssex='男' THEN 1 ELSE 0 END) 男生数,
SUM(CASE WHEN Ssex='女' THEN 1 ELSE 0 END) 女生数,
COUNT(*) 总人数
FROM student GROUP BY class;📝 本节例题
以下例题均基于 教学实例 库(student / course / sc / teacher / grades / dept / emp),开始前先执行 USE 教学实例;。建议先自己写一遍,再展开答案对照。
例 1
用 IF 判断学生是否成年(16 岁及以上显示“成年”)。
查看参考答案(可复制)
sql
SELECT Sname, sage, IF(sage >= 16, '成年', '未成年') 是否成年
FROM student;💡 IF(条件, 真时值, 假时值),适合二选一的场景。
例 2
用 CASE 把成绩分成优秀(≥90)、良好(≥75)、及格(≥60)、不及格四档。
查看参考答案(可复制)
sql
SELECT Sno, Cno, score,
CASE WHEN score >= 90 THEN '优秀'
WHEN score >= 75 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格' END 等级
FROM sc;💡 CASE 按顺序判断,命中即停,所以条件要从严到宽写。
例 3
借助 grades 等级区间表,统计各档次成绩各有多少人次(没有人的档次也要显示)。
查看参考答案(可复制)
sql
SELECT g.grade_level 等级, COUNT(sc.Sno) 人次
FROM grades g
LEFT JOIN sc ON sc.score BETWEEN g.lowest_sc AND g.highest_sc
GROUP BY g.grade_level
ORDER BY g.highest_sc DESC;💡 非等值连接(BETWEEN)也能当连接条件;用 LEFT JOIN 保证 0 人次的档次不丢。