求助:该SQL子查询存在什么问题?语句错误排查
问题分析与解决
先看你给出的SQL语句:
SELECT name, countrycode, population, avg(population) FROM city WHERE population > (SELECT avg(population) FROM city);
核心问题点
- 主查询中聚合函数与非聚合字段混用且无GROUP BY:你在SELECT里同时放了
name、countrycode、population这些单条记录的字段,又放了avg(population)这个聚合函数,但没有指定GROUP BY子句。- 严格的SQL模式下(比如MySQL的ONLY_FULL_GROUP_BY),这会直接报错,因为数据库无法确定非聚合字段要取哪条记录的值。
- 非严格模式下,数据库可能会随机返回一条记录的非聚合字段值,搭配整个表的平均人口,结果完全不符合预期。
修正方案
如果你想要的是找出所有人口超过城市平均人口的城市,并显示这些城市的信息以及整体平均人口,可以用以下两种方式修正:
方案1:保留子查询,去掉主查询的avg(population)(无需每行显示平均人口时用)
SELECT name, countrycode, population FROM city WHERE population > (SELECT avg(population) FROM city);
方案2:用窗口函数显示每行对应的整体平均人口
SELECT name, countrycode, population, overall_avg FROM ( SELECT name, countrycode, population, avg(population) OVER () AS overall_avg FROM city ) AS sub WHERE population > overall_avg;
内容的提问来源于stack exchange,提问作者ronniequeen
相关产品推荐
相关产品推荐

