mysql高版本(8.0+)group_by报错的处理方法

 更新时间:2023年09月03日 16:21:29   作者:*郑*  
本文主要介绍了mysql高版本(8.0+)group_by报错的处理方法,这个错误一般发生在mysql 5.7以及 5.7以上的版本中,本文就来介绍一下两种解决方法,感兴趣的可以了解一下

1. 原因

这个错误一般发生在mysql 5.7以及 5.7以上的版本中,其原因是mysql的默认配置中,sql_mode=“ONLY_FULL_GROUP_BY” 这个配置严格执行了 ‘SQL92标准’,查询字段没有在group by 字段后同时出现,那么sql语句就不合法,就会抛出错误

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxx' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这是由于MySQL高版本默认启用了sql_mode的only_full_group_by模式,对于GROUP BY操作,要求SELECT语句中的字段必须出现在GROUP BY子句中或者使用聚合函数进行处理。否则就会报上述错误。

2. 处理方法

连接mysql库,执行一下语句,查看sql_mode

select @@GLOBAL.sql_mode;

2.1 临时方法,重启后失效

SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

2.2 修改配置my.ini文件

在[mysqld]下面添加以下代码

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

3. 对查询结果中的字段应用聚合函数

若不能修改MySQL的配置文件,或者需要在特定场景使用原始的sql_mode值,我们也可以尝试在查询语句中对未出现在GROUP BY子句中的字段应用聚合函数来解决报错问题。

例如:

SELECT user_id, SUM(score) FROM scores GROUP BY user_id;

该语句会报错,因为SELECT语句中的score字段未出现在GROUP BY子句中。但是,我们可以尝试使用聚合函数:

SELECT user_id, MAX(score) FROM scores GROUP BY user_id;

该语句中的score字段被应用了MAX聚合函数,这样就符合了only_full_group_by模式的要求,不会报错。

示例

下面提供两个具体的示例来展示如何使用上述解决方案。假设我们有如下的scores数据表:

id   user_id   score
1    100      88
2    100      93
3    101      73
4    102      85
5    102      91

示例1:修改sql_mode参数值

我们可以通过如下步骤来修改MySQL的sql_mode参数:

打开MySQL的配置文件my.cnf或my.ini。

找到[mysqld]节点下的sql_mode参数(可能会有多个)。

将其值修改为:sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION。

保存文件并重启MySQL服务。

使用如下SQL查询语句,测试是否能正确查询出score字段的平均值:

SELECT AVG(score) FROM scores GROUP BY user_id;

示例2:使用聚合函数

在不修改MySQL的sql_mode参数的情况下,我们可以改变查询语句,使用聚合函数来解决only_full_group_by模式带来的限制。

例如,下列SQL语句查询出每个用户的最小成绩:

SELECT user_id, MIN(score) FROM scores GROUP BY user_id;

在这个查询语句中,score字段被应用了MIN聚合函数,符合only_full_group_by模式的要求。因此可以正常执行,并正确返回结果。

到此这篇关于mysql高版本(8.0+)group_by报错的处理方法的文章就介绍到这了,更多相关mysql group_by报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈在页面中获取到ModelAndView绑定的值方法

    浅谈在页面中获取到ModelAndView绑定的值方法

    下面小编就为大家分享一篇浅谈在页面中获取到ModelAndView绑定的值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Java实现解析ini文件对应到JavaBean中

    Java实现解析ini文件对应到JavaBean中

    ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式。这篇文章主要介绍了通过Java实现解析ini文件对应到JavaBean中,需要的可以参考一下
    2022-01-01
  • 通过Java创建Socket连接到服务器方式

    通过Java创建Socket连接到服务器方式

    这篇文章主要介绍了通过Java创建Socket连接到服务器方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 详解JavaEE中Apollo安装使用小结

    详解JavaEE中Apollo安装使用小结

    这篇文章主要介绍了详解JavaEE中Apollo安装与使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • mybatis log4j2打印sql+日志实例代码

    mybatis log4j2打印sql+日志实例代码

    在学习mybatis的时候,如果用log4j2来协助查看调试信息,则会大大提高学习的效率,加快debug速度,下面这篇文章主要给大家介绍了关于mybatis log4j2打印sql+日志的相关资料,需要的朋友可以参考下
    2022-08-08
  • 详解Java去除json数据中的null空值问题

    详解Java去除json数据中的null空值问题

    这篇文章主要介绍了详解Java去除json数据中的null空值问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 一篇文章带你入门Springboot沙箱环境支付宝支付(附源码)

    一篇文章带你入门Springboot沙箱环境支付宝支付(附源码)

    蚂蚁沙箱环境 (Beta) 是协助开发者进行接口功能开发及主要功能联调的辅助环境。沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑
    2021-06-06
  • Java日志框架之logback使用详解

    Java日志框架之logback使用详解

    这篇文章主要介绍了Java日志框架之logback使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • JDK1.8中的ConcurrentHashMap源码分析

    JDK1.8中的ConcurrentHashMap源码分析

    这篇文章主要介绍了JDK1.8中的ConcurrentHashMap源码分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 用Maven打成可执行jar,包含maven依赖,本地依赖的操作

    用Maven打成可执行jar,包含maven依赖,本地依赖的操作

    这篇文章主要介绍了用Maven打成可执行jar,包含maven依赖,本地依赖的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论