记一次Mysql8.0使用GROUP BY查询导致异常问题

👩🏽‍💻个人主页:阿木木AEcru (更多精彩内容可进入主页观看)

🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》

💹每一次技术突破,都是对自我能力的挑战和超越。

前言

看标题我相信大家都会有个疑惑,用个GROUP BY 查询怎么还会出问题?这不是很常见的一个查询语句吗?带着疑惑继续往下看吧。

一、错误信息

我们先来看看错误信息

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

错误信息中有提到 sql_mode=only_full_group_by 这个模式。

二、异常出现的原因

查询当前数据库的sql_mode配置

select @@GLOBAL.sql_mode;

ONLY_FULL_GROUP_BY 模式在 MySQL 5.7 版本开始默认开启。这个模式的引入是为了更严格地遵守 SQL92 标准中的 GROUP BY 子句规则。在该模式下,如果查询中使用了 GROUP BY 子句,那么 SELECT 列表中的所有非聚合列都必须在 GROUP BY 子句中明确指定,或者使用聚合函数进行处理。如果在升级到 MySQL 5.7 或更高版本后遇到与 ONLY_FULL_GROUP_BY 相关的错误,可能需要修改 SQL 查询或调整 MySQL 的 sql_mode 配置来解决兼容性问题。

三、解决方法

3.1 方式一:修改sql语句解决

使用 ANY_VALUE() 函数运用用在 GROUP BY 子句中没有的字段。

这样在sql层面上就可以修复这个问题,当然这个也是临时解决而已,这种方式就不太推荐。

3.2 方式二:修改sql_mode配置

修改全局sql_mode

需要注意的是这个全局设置只对后续新建的数据库有效。

SET @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

修改已有数据库的sql_mode

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

这种方式也会存在一个弊端,就是当数据库重启的时候,这个配置就失效了,需要重新执行来配置。

3.3 方式三:修改MySQL配置文件

推荐使用这种方式,可以一劳永逸,不过需要重启数据库

首先找到配置文件/etc/my.cnf或者/etc/mysql/my.cnf

找到配置文件中的[mysqld]配置,在下面添加上以下配置

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION


如上图所示

配置完成后重启mysql即可

sudo service mysql restart

重启完成后可以再次查询一次当前数据看sql_mode信息看下是否有生效。

select @@GLOBAL.sql_mode;

四、结尾

感谢观看至此,希望该文章能够帮助到您提升知识和技能。如果您喜欢我的内容,请不要忘记点赞和分享哦!👍

往期内容推荐

链接
Linux部署MySQL8.0—手把手保姆级教程
Docker部署MySQL主从详细教程
保姆级教程手把手教你如何快速部署一个属于你自己的微信AI机器人-支持群聊
还在用if校验参数?SpringBoot使用validation优雅实现参数校验
Docker三分钟部署ElasticSearch平替MeiliSearch轻量级搜索引擎
Java使用Hutool工具类轻松生成验证码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿木木AEcru

感谢您的阅读,赞赏请随意打赏!

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

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

打赏作者

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

抵扣说明:

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

余额充值