GROUP BY是否需要聚合功能?

时间:2018-05-29 10:31:45

标签: mysql sql group-by aggregation

问题:

  

给定CITY和COUNTRY表,查询所有表的名称   大陆(COUNTRY.Continent)及其各自的平均城市   人口(CITY.Population)向下舍入到最接近的整数。

     

注意:CITY.CountryCode和COUNTRY.Code是匹配的键列。做   不包括输出中没有城市的大陆。

我的解决方案:

SELECT COUNTRY.CONTINENT, FLOOR(AVG(CITY.POPULATION)) FROM COUNTRY INNER JOIN CITY ON COUNTRY.CODE=CITY.COUNTRYCODE

但是在添加GROUP BY语句之前,这似乎不起作用 更新的解决方案:

SELECT COUNTRY.CONTINENT, FLOOR(AVG(CITY.POPULATION)) FROM COUNTRY INNER JOIN CITY ON COUNTRY.CODE=CITY.COUNTRYCODE GROUP BY COUNTRY.CONTINENT

为什么会这样?为什么不显示新INNER JOIN表的平均人口值? 我知道这会给我一个错误的答案,即它将显示每个大陆相同的平均人口价值。但我怀疑的是,当我不添加GROUP BY语句时它为什么不起作用。

抛出的错误:

  

第1行的错误1140(42000):在没有GROUP BY的聚合查询中,   SELECT列表的表达式#1包含非聚合列   'run_y53padyvlle.COUNTRY.continent';这是不相容的   的sql_mode = only_full_group_by

1 个答案:

答案 0 :(得分:1)

问题不在于AVG()。你可以这样做:

SELECT FLOOR(AVG(ci.POPULATION))
FROM COUNTRY c INNER JOIN
     CITY ci
     ON c.CODE = ci.COUNTRYCODE;

这将返回一行,这是数据库中所有城市的总体平均人口。

问题在于:

SELECT c.CONTINENT, FLOOR(AVG(ci.POPULATION)) 
. . . 

CONTINENT部分是未分段的。 SQL引擎需要知道如何处理它。将密钥放在GROUP BY

GROUP BY c.CONTINENT

表示您希望结果集中的一行代表CONTINENT中的每个值。