面试SQL技术问题:下述SELECT查询语句存在哪些错误?
这条SQL查询的错误解析
嘿,这问题我之前面试也碰到过类似的,给你掰扯清楚哈!
这条SQL的核心错误在于在WHERE子句中使用了聚合函数AVG(marks),具体原因如下:
- WHERE子句的作用是在分组(GROUP BY)之前筛选单个行数据,这时候分组还没执行,聚合函数(比如AVG)的计算结果根本还没生成,数据库没办法用一个还不存在的聚合值去筛选原始行。
- 要对分组后的聚合结果进行筛选,必须用HAVING子句——它是专门用来在分组完成后,对分组的聚合结果做过滤的,这时候
AVG(marks)已经计算出每个科目的平均分了,就能正常判断是否大于75。
修正后的正确SQL
SELECT subject_code, AVG(marks) FROM students GROUP BY subject_code HAVING AVG(marks) > 75;
如果想让代码更清晰,还可以给聚合列起个别名,这样HAVING子句里读起来更直观(大部分主流数据库都支持这种写法):
SELECT subject_code, AVG(marks) AS average_marks FROM students GROUP BY subject_code HAVING average_marks > 75;
内容的提问来源于stack exchange,提问作者Frank Serkland
相关产品推荐
相关产品推荐

