解决mysql5.7Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column '

本文详细介绍了MySQL5.7.5及以上版本中出现的only_full_group_by错误的原因及其解决办法。当使用group by时,若查询列不在group by子句中且未使用聚合函数,则会触发此错误。

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

mysql5.7报错:

Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'userinfo.t_long.user_name' 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和up实现了对功能依赖的检测。如果启用了only_full_group_by SQL模式(在默认情况下是这样),那么MySQL就会拒绝选择列表、条件或顺序列表引用的查询,这些查询将引用组中未命名的非聚合列,而不是在功能上依赖于它们。(在5.7.5之前,MySQL没有检测到功能依赖项,only_full_group_by在默认情况下是不启用的。关于前5.7.5行为的描述,请参阅MySQL 5.6参考手册。)

解决:

 执行以下两个命令:

mysql> 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';

mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';



### 解决 Linux 系统中 MySQL 查询时遇到的 GROUP BY 错误 当在 MySQL 8.0 及更高版本执行 `SELECT` 查询并尝试选择未聚合列而不将其放在 `GROUP BY` 子句中时,可能会收到如下错误: ```plaintext ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'jol.solution.nick' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by. ``` 此行为是因为自 MySQL 5.7 起,默认启用了 `ONLY_FULL_GROUP_BY SQL` 模式[^1]。 #### 方法一:修改查询语句 最推荐的方法是对查询本身进行调整。如果确实需要返回非聚集字段,则应确保这些字段要么被适当聚合计数处理过,要么它们的功能依赖于分组键。例如: 假设有一个表名为 `orders` 的订单记录表格,其中包含客户 ID (`customer_id`) 和订单金额 (`amount`) 字段。要获取每位客户的总消费额以及任意一条订单详情(如第一个),可以这样写: ```sql SELECT customer_id, MAX(order_details), SUM(amount) AS total_spent FROM orders GROUP BY customer_id; ``` 这里使用了 `MAX()` 函数来选取每组内的某条特定记录作为代表,从而满足 `ONLY_FULL_GROUP_BY` 的要求[^3]。 #### 方法二:临时禁用 ONLY_FULL_GROUP_BY 如果不希望更改现有查询逻辑,在某些情况下可以选择暂时关闭这个严格的模式设置。可以通过会话级别的命令实现这一点而无需重启数据库服务: ```bash SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 上述指令仅影响当前连接下的操作环境,并不会改变全局配置文件里的设定,因此对于生产环境中偶尔调试非常有用[^2]。 #### 方法三:永久移除 ONLY_FULL_GROUP_BY 设置 为了使变更持久化适用于所有新建立起来的新客户端链接,可以在 `/etc/my.cnf.d/` 或者其他合适位置编辑 my.cnf 文件,找到 `[mysqld]` 部分加入下面这行代码保存退出即可生效: ```ini [mysqld] sql-mode="" ``` 请注意这样做可能会影响数据一致性和准确性,请谨慎评估后再做决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值