MySQL报错sql_mode=only_full_group_by的问题解决

 更新时间:2025年02月07日 09:32:46   作者:我梦Leo  
本文主要介绍了MySQL报错sql_mode=only_full_group_by的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

报错信息

DataGrip 报错还原

[42000][1055] Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘xx库.xx表.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

在这里插入图片描述

Navicat 报错还原

1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘school.student_100w.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

在这里插入图片描述

报错原因

MySQL 5.7后,MySQL的 SQL_MODE 配置项会默认包含 only_full_group_by 模式,这个配置会严格执行SQL92标准。如果代码中含有group by聚合操作,那么select中的列,除了使用聚合函数之外的,如max()、min()等,都必须出现在group by中。

要求:从学生表中,根据班级编号,分组查询班级编号、班级名称。

报错:SELECT 查询的字段和 GROUP BY 分组依据的字段不统一。

# SELECT 查询的字段和 GROUP BY 分组依据的字段不统一,会报错。
SELECT class_number, class_name FROM student GROUP BY class_number;

调整:将SELECT 查询的字段和 GROUP BY 分组依据的字段统一。

# SELECT 查询字段和 GROUP BY 分组依据的字段统一后就不会报错。
SELECT class_number, class_name FROM student GROUP BY class_number, class_name ;
# SELECT 查询字段和 GROUP BY 分组依据的字段统一后就不会报错。
SELECT class_number FROM student GROUP BY class_number;

解决方案

查看当前 sql mode

执行 SQL 语句,查看当前的 sql_mode 。

SELECT @@global.sql_mode;

注意默认的列宽可能无法直接查看全部内容,容易造成误解,需要手动拉伸列宽查看。

在这里插入图片描述

拉伸列宽后可查看全部内容,(不同版本的 MySQL 默认值可能不同)。

在这里插入图片描述

方案一:临时解决

排除当前 sql_mode 中 ONLY_FULL_GROUP_BY 值,复制剩下的值。执行设置语句:

SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

但是如果当前数据库重启后,还是回归默认设置,即包含 ONLY_FULL_GROUP_BY 模式。

方案二:永久解决

windows系统,直接修改 my.ini 配置文件。

在这里插入图片描述

在 [mysqld] 模块下新增一行配置:

sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

注意:

  • 不能有多余的符号,我之前在结尾加了分号导致重启失败。
  • 点击保存文件,不要直接关掉。 不然设置丢失,是不会生效的。

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f6c6cb0048814855854fefede42f0be4.png

Linux系统,思路是一样的,都是找配置文件修改配置。但是不同Mysql版本,路径和配置文件名称可能不同:大致可能是 /etc/my.cnf 或者 /mysql.conf 之类的名称。

数据库重启后生效。

方案三:使用 any_value() 或 group_concat()

  • any_value():
    • 将分到同一组的数据里第一条数据的指定列值作为返回数据。 (any_value()函数就是MySQL提供的用来抑制ONLY_FULL_GROUP_BY值被拒绝的)
SELECT class_number, any_value(class_name) FROM student GROUP BY class_number;

实际使用效果如下:

在这里插入图片描述

  • group_concat():
    • 将分到同一组的数据默认用逗号隔开作为返回数据。
SELECT class_number, group_concat(class_name) FROM student GROUP BY class_number;

实际使用效果如下:

在这里插入图片描述

方案四:调整实现思路,避开 GROUP BY 使用

通过对SQL的查询思路调整,代码逻辑调整等,部分场景是可以绕开对 GROUP BY 关键字筛选依赖的。这个需要结合实际业务场景,自己去思考调整了。

到此这篇关于MySQL报错sql_mode=only_full_group_by的问题解决的文章就介绍到这了,更多相关MySQL sql_mode=only_full_group_by内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 通过ibd文件恢复MySql数据的操作方法

    通过ibd文件恢复MySql数据的操作方法

    文章介绍通过.ibd文件恢复MySQL数据的过程,包括知道表结构和不知道表结构两种情况,对于知道表结构的情况,可以直接将.ibd文件复制到新的数据库目录并重启MySQL,对于不知道表结构的情况,可以使用ibd2sql工具生成对应的SQL脚本,然后执行该脚本恢复数据,感兴趣的朋友看看吧
    2025-03-03
  • MYSQL本地安装以及出现的问题解决

    MYSQL本地安装以及出现的问题解决

    这篇文章主要给大家介绍了关于MYSQL本地安装以及出现问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • MySQL数据库索引及优化的示例详解

    MySQL数据库索引及优化的示例详解

    在日常的数据库使用过程中,我们经常需要对数据进行查询、插入、删除等操作,为了提高这些操作的效率,数据库的性能优化显得尤为重要,本文就来讲讲MySQL中是如何优化索引的吧
    2023-05-05
  • MySql中使用正则表达式查询的方法

    MySql中使用正则表达式查询的方法

    Mysql 使用 REGEXP 关键字指定正则表达式的字符匹配模式。接下来通过本文给大家分享MySql中使用正则表达式查询的方法,感兴趣的朋友一起看看吧
    2017-07-07
  • Mysql命令行连接远程/本地数据库详解

    Mysql命令行连接远程/本地数据库详解

    新使用MySQL,说起来是个简单的事情,,但是却费了些周折,下面这篇文章主要给大家介绍了关于Mysql命令行连接远程/本地数据库的相关资料,文中介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Mysql 前模糊索引失效原因及解决方式

    Mysql 前模糊索引失效原因及解决方式

    前模糊查询导致索引失效是因为B+树无法对不确定首字符进行有序检索,下面介绍了几种解决方法,感兴趣的可以来了解一下
    2026-03-03
  • SQL实现LeetCode(182.重复的邮箱)

    SQL实现LeetCode(182.重复的邮箱)

    这篇文章主要介绍了SQL实现LeetCode(182.重复的邮箱),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Mysql SSH隧道连接使用的基本步骤

    Mysql SSH隧道连接使用的基本步骤

    这篇文章主要给大家介绍了关于Mysql SSH隧道连接使用的基本步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • Mysql Explain命令的使用与分析

    Mysql Explain命令的使用与分析

    今天小编就为大家分享一篇关于Mysql Explain命令的使用与分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • linux下mysql的安装步骤

    linux下mysql的安装步骤

    本文分步骤给大家介绍了linux下mysql的安装步骤及执行命令,需要的朋友可以参考下
    2018-03-03

最新评论