mysql之ONLY_FULL_GROUP_BY 问题解决办法

本文探讨了在MySQL中执行分组查询时遇到的一个常见错误:ERROR 1055 (42000)。该错误提示某些列未包含在GROUP BY子句中,并解释了如何通过修改SQL_MODE设置来解决此问题。

大家在对数据表进行分组查询的时候肯定遇到过类似于这样的问题:
select username,age from users group by age;
然后mysql 就报错:
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mytest.users.username' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
大致的意思就是你必须将所要查询的username,age都进行分组操作才可以....所以就必须这样
select username,age from users group by age,username;才能通过编译,但这样就失去了分组本来的意义
因此我们通过改变sql_mode='';来改变原来的sql_mode='ONLY_FULL_GROUP_BY';这样就可以了

### MySQL 8.0 中 only_full_group_by 的设置方法及影响 在 MySQL 8.0 及以上版本中,`only_full_group_by` 是 SQL 模式的一部分,用于强制执行更严格的 `GROUP BY` 规则。这种模式确保查询中的非聚合列必须出现在 `GROUP BY` 子句中[^1]。如果未满足此条件,MySQL 将抛出错误。 #### 设置方法 以下是几种常见的设置 `only_full_group_by` 的方法: 1. **修改配置文件 `my.cnf` 或 `my.ini`** 在 MySQL 配置文件中添加或修改 `sql_mode` 参数,移除 `ONLY_FULL_GROUP_BY` 模式: ```ini [mysqld] sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' ``` 修改完成后需要重启 MySQL 服务以使更改生效[^1]。 2. **临时修改 SQL 模式** 如果不想永久更改配置文件,可以通过会话级别的命令临时禁用 `ONLY_FULL_GROUP_BY`: ```sql SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 这种方法仅对当前会话有效,或者直到 MySQL 服务重启为止[^2]。 3. **使用图形化工具(如 Navicat)修改** 通过 Navicat 等图形化工具连接到 MySQL 数据库后,可以执行上述 SQL 命令来动态调整 SQL 模式[^2]。 #### 影响分析 启用 `only_full_group_by` 后,MySQL 对 `GROUP BY` 查询的处理更加严格。具体影响如下: 1. **查询限制** - 在启用了 `only_full_group_by` 的情况下,任何不在 `GROUP BY` 子句中列出的非聚合列都将被禁止出现在 `SELECT` 列表中[^3]。 - 例如,以下查询将失败: ```sql SELECT customer_id, order_date, COUNT(*) FROM orders GROUP BY customer_id; ``` 错误信息为:`Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'orders.order_date' which is not functionally dependent on columns in GROUP BY clause`. 2. **数据一致性** - 启用 `only_full_group_by` 提高了数据查询的一致性,避免了潜在的歧义和错误结果。 - 例如,当 `order_date` 不唯一时,MySQL 不再随意选择一个值作为结果,而是强制用户明确指定如何处理这些值。 3. **性能优化** - 更严格的规则可能促使开发者编写更清晰、更高效的查询语句,从而间接提升数据库性能。 4. **兼容性问题** - 某些旧版应用程序可能依赖于较宽松的 `GROUP BY` 行为。在这种情况下,禁用 `only_full_group_by` 可能是权宜之计,但长期来看,建议重构相关查询以符合新标准[^1]。 ```sql -- 示例:正确使用 GROUP BY SELECT customer_id, MAX(order_date), COUNT(*) FROM orders GROUP BY customer_id; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值