SQL查询:基于人文科目平均分筛选学生时WHERE子句报错咨询
问题解决:筛选人文学科平均分≥1.0的学生
你遇到的报错是因为WHERE子句的执行时机早于分组和聚合计算——在WHERE执行时,avg_score这个别名还没生成,而且WHERE不能直接使用聚合函数来筛选分组后的结果。
最优解决方案:使用HAVING子句
不需要子查询,直接用HAVING就能实现需求,它专门用于过滤分组后的聚合结果,写法更简洁高效:
select first_name, last_name, round(avg(score),1) as avg_score from pruebas.tb_students where test_name in ('History', 'English') group by first_name, last_name having avg(score) >= 1.0
注:HAVING里尽量用原始的
avg(score)而非别名avg_score,部分数据库不支持在HAVING中引用SELECT里的别名,这样写兼容性更好。
子查询写法(可选)
如果一定要用子查询,也可以先计算所有符合学科条件的学生平均分,再在外层筛选:
select * from ( select first_name, last_name, round(avg(score),1) as avg_score from pruebas.tb_students where test_name in ('History', 'English') group by first_name, last_name ) as student_avg where avg_score >= 1.0
总结
优先选择HAVING子句的写法,逻辑更直接,性能也更优;子查询虽然可行,但属于冗余写法。
内容的提问来源于stack exchange,提问作者kubaSpolsky
相关产品推荐
相关产品推荐

