完美MySQL报错:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column的解

在使用 MySQL 时,可能会遇到这样的错误提示:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column”。这通常是由于在 GROUP BY 查询中,SELECT 列表中的某些列没有被包含在 GROUP BY 子句中或没有使用聚合函数所导致的。本文将详细介绍这一错误的原因,并提供相应的解决方法。


🧑 博主简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:gylzbk

💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

在这里插入图片描述

在这里插入图片描述

1️⃣ 错误原因分析

首先,我们来看一个可能引发该错误的 SQL 查询示例:

SELECT id, name, COUNT(*)
FROM users
GROUP BY id;

假设 users 表结构如下:

idnameage
1Alice25
2Bob30
1Alice26

在上面的查询中,id 列被包含在 GROUP BY 子句中,而 name 列没有被包含在 GROUP BY 子句中,也没有使用聚合函数。根据 SQL 标准,SELECT 列表中的列要么应该包含在 GROUP BY 子句中,要么应该使用聚合函数进行处理。

因此,上述查询在某些 SQL 模式下会报错。

2️⃣ 解决方法

2.1 方法一:修改SQL查询

最直接的方法是修改 SQL 查询,使得 SELECT 列表中的所有列都包含在 GROUP BY 子句中,或者使用聚合函数。

2.1.1 将所有列包含在 GROUP BY 子句中

SELECT id, name, COUNT(*)
FROM users
GROUP BY id, name;

2.1.2 使用聚合函数

如果不希望在 GROUP BY 子句中包含所有列,可以使用聚合函数。例如,可以使用 MAX()MIN() 函数:

SELECT id, MAX(name), COUNT(*)
FROM users
GROUP BY id;

2.2 方法二:设置SQL模式

MySQL 从 5.7.5 版本开始引入了 ONLY_FULL_GROUP_BY SQL 模式,该模式要求 SELECT 列表中的列要么包含在 GROUP BY 子句中,要么使用聚合函数。如果不希望修改 SQL 查询,可以通过调整 SQL 模式来解决此问题。

2.2.1 临时禁用 ONLY_FULL_GROUP_BY 模式

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

或者针对当前会话禁用:

SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

2.2.2 永久禁用 ONLY_FULL_GROUP_BY 模式

修改 MySQL 配置文件(通常为 my.cnfmy.ini),找到 sql_mode 配置项并移除 ONLY_FULL_GROUP_BY

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

然后重启 MySQL 服务:

sudo systemctl restart mysql

3️⃣ 总结

在本文中,我们详细介绍了 MySQL 报错“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column”的原因,并提供了两种解决方法:

  1. 修改 SQL 查询,使得 SELECT 列表中的所有列都包含在 GROUP BY 子句中,或者使用聚合函数。
  2. 调整 SQL 模式,临时或永久禁用 ONLY_FULL_GROUP_BY 模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

I'mAlex

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

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

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

打赏作者

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

抵扣说明:

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

余额充值