版本问题:mysql报错 > 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated
附上ai回答:
A: 这个错误提示表明您正在尝试执行一个包含SELECT语句的SQL查询,该SELECT语句包含一个表达式,该表达式未包含在GROUP BY子句中,并且该表达式包含一个非聚合列,该列在GROUP BY子句中并没有被函数依赖。
当sql_mode变量设置为only_full_group_by时,此错误会发生,该模式要求所有在SELECT子句中不包含在聚合函数(如SUM、COUNT、AVG、MAX或MIN)中的列都必须包含在GROUP BY子句中。这是一种严格的操作模式,旨在防止在分组数据时出现歧义结果。
要解决此错误,您需要修改SQL查询,以确保SELECT子句中的所有非聚合列也包含在GROUP BY子句中。或者,您可以将sql_mode变量更改为较不严格的模式,该模式允许在SELECT子句中包含非聚合列而无需在GROUP BY子句中包含它们。但是,请注意,在某些情况下,这可能会导致产生歧义的结果。
以下是修改SQL查询以包括所有非聚合列在GROUP BY子句中的示例:
SELECT id, AVG(temperature)
FROM iot_device_meteorological
GROUP BY id;
在此示例中,id列包含在SELECT子句和GROUP BY子句中,这确保了查询与only_full_group_by模式兼容。
Q:怎么将sql_mode变量更改为较不严格的模式
A:要将sql_mode变量更改为较不严格的模式,您可以按照以下步骤进行操作:
打开MySQL客户端或其他MySQL管理工具。
使用管理员或具有适当权限的用户登录MySQL。
运行以下命令,以查看当前的sql_mode设置:
SELECT @@sql_mode;
复制该命令返回的结果。
运行以下命令,以修改sql_mode设置:
SET sql_mode = '复制的结果中去掉only_full_group_by的部分';
例如,如果当前的sql_mode设置为
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
您可以使用以下命令将其更改为不包括ONLY_FULL_GROUP_BY的模式:
SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
运行以下命令,以确认sql_mode设置已经更改:
SELECT @@sql_mode;
注意,更改sql_mode设置可能会影响MySQL服务器的行为,因此请在进行更改之前,仔细考虑是否需要这样做,并确保了解更改可能会产生的影响。
浙公网安备 33010602011771号