经典SQL查询问题的练习第四天
📝 第四天 SQL 打卡题目
student(studentId, studentName)
course(courseId, courseName, teacher,prerequisite(先修课程))
score(score, studentId, courseId,year)
题目1:查询每位学生的优势学科
SELECT s.studentId,s.studentName,c.courseName,sc.score
FROM score sc
JOIN student s ON sc.studentId = s.studentId
JOIN course c ON sc.courseId = c.courseId
WHERE sc.score > (SELECT AVG(score) FROM score WHERE studentId = sc.studentId
);
该查询通过子查询计算每位学生的平均成绩,然后筛选出高于该平均分的课程记录。JOIN操作关联学生和课程信息,最终返回学生ID、姓名、课程名和成绩。
题目2:查询连续两年选修同一门课程的学生
SELECT a.studentId,s.studentName,a.courseId,c.courseName
FROM score a
JOIN score b ON a.studentId = b.studentId AND a.courseId = b.courseIdAND a.year = b.year - 1
JOIN student s ON a.studentId = s.studentId
JOIN course c ON a.courseId = c.courseId;
通过自连接查找同一学生在相邻两年选修相同课程的记录。连接条件包括学生ID、课程ID和年份差为1。
题目3:查询教师授课成绩的标准差
SELECT c.teacher,c.courseName,ROUND(STDDEV(sc.score), 2) AS score_stddev,COUNT(*) AS student_count
FROM score sc
JOIN course c ON sc.courseId = c.courseId
GROUP BY c.teacher, c.courseName
HAVING COUNT(*) > 5
ORDER BY score_stddev DESC;
使用STDDEV函数计算每位教师所授课程成绩的标准差,反映评分稳定性。HAVING子句过滤学生数量少于5的课程,确保统计有效性。
题目4:使用CTE递归查询选课路径依赖
WITH RECURSIVE course_path AS (SELECT courseId, courseName, 1 AS level FROM course WHERE prerequisite IS NULLUNION ALLSELECT c.courseId, c.courseName, cp.level + 1FROM course cJOIN course_path cp ON c.prerequisite = cp.courseId
)
SELECT * FROM course_path ORDER BY level;
递归CTE从无先修课的课程开始,逐层查找依赖关系。level字段表示课程在依赖树中的深度。
题目5:使用CASE WHEN实现成绩分段统计
SELECT c.courseName,COUNT(*) AS total,SUM(CASE WHEN sc.score >= 90 THEN 1 ELSE 0 END) AS 'A',SUM(CASE WHEN sc.score >= 80 AND sc.score < 90 THEN 1 ELSE 0 END) AS 'B',SUM(CASE WHEN sc.score < 60 THEN 1 ELSE 0 END) AS '不及格'
FROM score sc
JOIN course c ON sc.courseId = c.courseId
GROUP BY c.courseName;
通过CASE WHEN条件表达式统计各分数段人数,实现成绩分布透视。每个CASE返回1或0,SUM聚合计算满足条件的人数。
题目6:优化包含LIKE和ORDER BY的混合查询
-- 方案1:创建覆盖索引
ALTER TABLE student ADD INDEX idx_name_id (studentName, studentId);-- 方案2:对大数据量使用延迟关联
SELECT s.* FROM student s
JOIN (SELECT studentId FROM student WHERE studentName LIKE '张%'ORDER BY studentId DESCLIMIT 100
) tmp ON s.studentId = tmp.studentId;
复合索引idx_name_id满足最左前缀原则和排序需求。延迟关联先在内层查询中利用索引快速定位ID,再通过JOIN获取完整数据,减少回表操作。
实际应用场景总结
优势学科分析可用于学生能力画像,连续选课查询反映学习行为持续性,标准差评估教学质量稳定性,递归CTE分析课程体系依赖,成绩分段统计支持可视化报表,索引优化提升模糊搜索性能。
💡 每日考点总结
题号 | 核心考点 | 实际应用场景 |
---|---|---|
1 | 子查询比较 | 学生能力画像分析 |
2 | 自连接时间序列 | 学习行为连续性分析 |
3 | 统计函数应用 | 教学质量稳定性评估 |
4 | CTE递归查询 | 课程体系依赖关系分析 |
5 | 条件聚合 | 成绩分布可视化准备 |
6 | 索引覆盖+延迟关联 | 模糊搜索性能优化 |