如何编写SQL查询平均分大于60分的学生ID和姓名?
解决思路与正确SQL语句
首先明确:你的需求是查询平均分大于60的学生ID和姓名,不需要关联Course表——因为Score表已经包含学生ID(s_id)和对应成绩(s_s_score),只需要关联Student表获取学生姓名即可。
你的原SQL存在三个核心问题:
- 多表关联的
ON子句缺少明确关联条件,必须指定两个表的关联字段,比如Student.s_id = Score.s_id,而不是只写ON s_id - 聚合函数
AVG()不能直接放在WHERE子句中,WHERE用于过滤行级原始数据,聚合条件需要用HAVING,且必须配合GROUP BY按学生分组计算平均分 - 不必要关联Course表,会增加无意义的关联计算,且对结果无帮助
正确SQL语句(仅统计有选课记录的学生)
SELECT Student.s_id, Student.s_name FROM Student INNER JOIN Score ON Student.s_id = Score.s_id GROUP BY Student.s_id, Student.s_name HAVING AVG(Score.s_s_score) > 60;
语句说明
- INNER JOIN:只保留有成绩记录的学生(如果用LEFT JOIN会包含没选课的学生,他们的平均分为NULL,不满足>60的条件,结果和INNER JOIN一致)
- GROUP BY:按学生ID和姓名分组,确保
AVG()计算的是每个学生的所有课程成绩的平均分 - HAVING:过滤分组后平均成绩大于60的学生,这是聚合条件的正确使用方式
内容的提问来源于stack exchange,提问作者Yehui He
相关产品推荐
相关产品推荐

