当我们在列上选择聚合函数以及没有聚合函数的列时,是否有必要使用 GROUP BY



我收到一个错误,即:

"列'Weather.cityName'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中"。

为什么这里有必要使用GROUP BY

SELECT cityName , MAX (highTemperature) As highTemperature
FROM Weather
WHERE cityName = 'Rawalpindi';

为什么有必要使用 GROUP BY . 您有一个聚合查询,您希望每个城市返回一行 - 即使只有一个城市。 这使查询成为聚合查询。 您可以调整查询,使其不需要。 以下是两种方法:

SELECT MAX(cityName) as cityName, MAX(highTemperature) As highTemperature
FROM Weather
WHERE cityName = 'Rawalpindi';

或:

SELECT 'Rawalpindi' as cityName, MAX(highTemperature) As highTemperature
FROM Weather
WHERE cityName = 'Rawalpindi';

这两者都是有效的聚合查询,没有GROUP BY。 因此,它们将只返回一行 - 即使没有行与 WHERE 子句匹配。 代替CityName,他们使用聚合函数或常量,所以没有问题。

MySQL允许使用以下语法:

组的 MySQL 处理 由

SQL:1999 及更高版本允许每个可选功能进行此类非聚合 T301 如果它们在功能上依赖于 GROUP BY 列:如果这样的 名称和客户之间存在关系,查询是合法的。这 例如,如果 custid 是主键 客户。

MySQL 5.7.5 及更高版本实现了功能依赖性的检测。如果 启用ONLY_FULL_GROUP_BY SQL模式(默认情况下(, MySQL 拒绝选择列表、具有条件或 ORDER BY 列表是指未在 中命名的非聚合列 GROUP BY 子句在功能上也不依赖于它们。

SELECT cityName , MAX(highTemperature) As highTemperature
FROM Weather
WHERE cityName IN('Rawalpindi', 'Delphi');
-- In aggregated query without GROUP BY,
-- expression #1 of SELECT list contains nonaggregated column 'cityName';
-- this is incompatible with sql_mode=only_full_group_by
SELECT cityName , MAX(highTemperature) As highTemperature
FROM Weather
WHERE cityName = 'Rawalpindi';

数据库<>小提琴演示

最新更新