mysql遇见Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的问题

本文介绍了解决MySQL5.7.5及以上版本中因ONLY_FULL_GROUP_BY模式导致的查询错误的方法。通过调整sql_mode配置,提供两种可行方案:一是临时禁用ONLY_FULL_GROUP_BY,二是永久修改配置文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错如下:

Expression #2 of SELECT list is not in GROUP BY clause and contains
nonaggregated column ‘sss.month_id’ which is not functionally
dependent on columns in GROUP BY clause; this is incompatible with
sql_mode=only_full_group_by

问题出现的原因:
MySQL 5.7.5及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。(5.7.5之前,MySQL没有检测到功能依赖关系,默认情况下不启用ONLY_FULL_GROUP_BY。有关5.7.5之前的行为的说明,请参见“MySQL 5.6参考手册”。)

解决方法一:

打开navcat,

用sql查询:

select @@global.sql_mode

查询出来的值为:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

去掉ONLY_FULL_GROUP_BY,重新设置值。

set @@global.sql_mode
=’STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’;

如下图:

这里写图片描述

解决方法二:

成功的步骤:

iterm打开

sudo vim /etc/mysql/conf.d/mysql.cnf

滚动到文件底部复制并粘贴

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

到文件的底部

保存并退出输入模式

sudo service mysql restart

重启MySQL。
完成!

如下图:
这里写图片描述

这里写图片描述

### 问题分析 MySQL版本5.7及之后,默认启用了`sql_mode=only_full_group_by`模式[^2]。该模式要求在`GROUP BY`子句中,所有非聚合字段必须出现在`GROUP BY`列表中,或者这些字段必须是函数依赖的。如果违反这一规则,就会出现类似`Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column`的错误。 以下是解决此问题的详细方法: --- ### 解决方案 #### 方法一:修改SQL查询语句 通过调整SQL查询语句,确保所有非聚合字段都包含在`GROUP BY`子句中。例如: ```sql SELECT column1, column2, column3, COUNT(*) FROM table_name GROUP BY column1, column2, column3; ``` 上述查询语句将`column1`, `column2`, 和`column3`添加到`GROUP BY`子句中,从而满足`ONLY_FULL_GROUP_BY`的要求[^2]。 --- #### 方法二:禁用`ONLY_FULL_GROUP_BY`模式 可以通过修改MySQL的配置文件或临时更改`sql_mode`来禁用`ONLY_FULL_GROUP_BY`模式。 **步骤:** 1. **查找MySQL配置文件** 在Windows系统中,配置文件通常位于`C:/ProgramData/MySQL/MySQL Server x.x/my.ini`[^3];在Linux系统中,配置文件可能位于`/etc/mysql/my.cnf`或`/etc/my.cnf`。 2. **编辑配置文件** 打开配置文件,找到`sql_mode`设置行。例如: ```ini sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,... ``` 将`ONLY_FULL_GROUP_BY`从`sql_mode`中移除。修改后的内容如下: ```ini sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,... ``` 3. **重启MySQL服务** 在命令行中执行以下命令以重启MySQL服务(Windows示例): ```bash net stop mysql net start mysql ``` 或者直接重启计算机以确保配置生效。 4. **验证更改** 登录MySQL并运行以下命令,确认`sql_mode`中不再包含`ONLY_FULL_GROUP_BY`: ```sql SELECT @@sql_mode; ``` --- #### 方法三:使用`ANY_VALUE()`函数 MySQL提供了`ANY_VALUE()`函数,用于明确指定某些字段可以忽略`ONLY_FULL_GROUP_BY`的限制。例如: ```sql SELECT column1, ANY_VALUE(column2), COUNT(*) FROM table_name GROUP BY column1; ``` 在此示例中,`column2`被包装在`ANY_VALUE()`函数中,表示即使它不在`GROUP BY`子句中,也可以安全地使用[^2]。 --- ### 注意事项 - 修改数据库配置文件会影响整个数据库实例的行为,需谨慎操作。 - 如果选择禁用`ONLY_FULL_GROUP_BY`模式,可能会导致查询结果不一致,特别是在数据存在多值的情况下[^3]。 - 推荐优先考虑修改SQL查询语句以符合标准,而不是禁用严格模式。 --- ### 示例代码 以下是一个完整的示例,展示如何解决`Expression #2`错误: ```sql -- 原始查询(报错) SELECT category, product_name, price, COUNT(*) FROM products GROUP BY category; -- 修改后的查询(方法一:添加所有非聚合字段到GROUP BYSELECT category, product_name, price, COUNT(*) FROM products GROUP BY category, product_name, price; -- 修改后的查询(方法三:使用ANY_VALUE()函数) SELECT category, ANY_VALUE(product_name), ANY_VALUE(price), COUNT(*) FROM products GROUP BY category; ``` ---
评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@SokachWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值