You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

语句解释

  1. 显式JOIN关联:用JOIN ... ON明确三张表的关联条件,Offering和Enrollment通过开课号关联,Enrollment和Student通过学生学号关联
  2. 聚合计算平均GPA:AVG(S.StdGPA)计算每个开课分组下的学生平均GPA,用AS AvgStudentGPA给结果列起个易懂的别名
  3. 分组规则:GROUP BY O.CourseNo, E.OfferNo保证我们是按「课程号+开课号」的组合来分组,毕竟同一门课可能有多个不同的开课记录
  4. 筛选聚合结果:用HAVING AVG(S.StdGPA) > 3.0来过滤平均GPA超过3.0的分组——这里不能用WHERE,因为WHERE是在分组前筛选行数据,而HAVING是针对分组后的聚合结果做筛选

内容的提问来源于stack exchange,提问作者Joel Patteson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:28:10