MySQL查询求助:如何编写冬季学期GPA达标课程的统计查询语句
修正你的SQL查询:获取符合条件的课程平均GPA
我一看你的查询就知道问题出在哪了——你还没搞懂分组聚合的逻辑,而且条件用错地方啦!咱们一步步来修正:
原查询的问题点
- 没有分组计算平均:你直接查了每个学生的GPA,但需求要的是每门开课的学生平均GPA,必须用
GROUP BY来按课程号和开课号分组 - 条件逻辑错误:你用
S.StdGPA > 3.0是筛选单个GPA超过3.0的学生,而不是整个开课群体的平均GPA达标,这完全不符合需求 - JOIN写法不规范:虽然隐式JOIN能跑,但显式
JOIN ... ON的可读性更强,不容易出错
正确的查询语句
SELECT O.CourseNo, E.OfferNo, AVG(S.StdGPA) AS AvgStudentGPA FROM Offering O JOIN Enrollment E ON O.OfferNo = E.OfferNo JOIN Student S ON E.stdSSN = S.StdSSN WHERE O.OffTerm = 'WINTER' GROUP BY O.CourseNo, E.OfferNo HAVING AVG(S.StdGPA) > 3.0;
语句解释
- 显式JOIN关联:用
JOIN ... ON明确三张表的关联条件,Offering和Enrollment通过开课号关联,Enrollment和Student通过学生学号关联 - 聚合计算平均GPA:
AVG(S.StdGPA)计算每个开课分组下的学生平均GPA,用AS AvgStudentGPA给结果列起个易懂的别名 - 分组规则:
GROUP BY O.CourseNo, E.OfferNo保证我们是按「课程号+开课号」的组合来分组,毕竟同一门课可能有多个不同的开课记录 - 筛选聚合结果:用
HAVING AVG(S.StdGPA) > 3.0来过滤平均GPA超过3.0的分组——这里不能用WHERE,因为WHERE是在分组前筛选行数据,而HAVING是针对分组后的聚合结果做筛选
内容的提问来源于stack exchange,提问作者Joel Patteson
相关产品推荐
相关产品推荐

