在使用 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昵称,拉你进群,互相学习共同进步。
完美MySQL报错:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column的解决方法
1️⃣ 错误原因分析
首先,我们来看一个可能引发该错误的 SQL 查询示例:
SELECT id, name, COUNT(*)
FROM users
GROUP BY id;
假设 users
表结构如下:
id | name | age |
---|---|---|
1 | Alice | 25 |
2 | Bob | 30 |
1 | Alice | 26 |
在上面的查询中,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.cnf
或 my.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”的原因,并提供了两种解决方法:
- 修改 SQL 查询,使得
SELECT
列表中的所有列都包含在GROUP BY
子句中,或者使用聚合函数。 - 调整 SQL 模式,临时或永久禁用
ONLY_FULL_GROUP_BY
模式。