> 技术文档 > 完美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的解

在使用 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️⃣ 错误原因分析
  • 2️⃣ 解决方法
    • 2.1 方法一:修改SQL查询
      • 2.1.1 将所有列包含在 `GROUP BY` 子句中
      • 2.1.2 使用聚合函数
    • 2.2 方法二:设置SQL模式
      • 2.2.1 临时禁用 `ONLY_FULL_GROUP_BY` 模式
      • 2.2.2 永久禁用 `ONLY_FULL_GROUP_BY` 模式
  • 3️⃣ 总结

在这里插入图片描述

1️⃣ 错误原因分析

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

SELECT id, name, COUNT(*)FROM usersGROUP 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 usersGROUP BY id, name;

2.1.2 使用聚合函数

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

SELECT id, MAX(name), COUNT(*)FROM usersGROUP 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 模式。