mysql 的 sql_mode.only_full_group_by属性解析
文章目录
- 1. 初始条件
- 2. 现象
- 3. 解决
- ①:关闭sql_mode 的 only_full_group_by模式
- ②:使用 ANY_VALUE() 抑制 ONLY_FULL_GROUP_BY 的影响
mysql8.0官网:处理 group by
1. 初始条件
现在有这样一张表,其中有两条 name = 裤子
的数据
2. 现象
执行以下sql,想要得到按name
分组的数据:GROUP BY name
SELECT name,author,SUM(price) FROM `t_book`
GROUP BY name
在执行 sql 时 出现了 1055
异常
SELECT name,author,SUM(price) FROM `t_book`
GROUP BY name
> 1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.t_book.author' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
> 时间: 0.03s
按照错误提示,执行以下语句:GROUP BY name ,author
,查询才不会报错
SELECT name,author,SUM(price) FROM `t_book`
GROUP BY name ,author
查询结果:
但是,这种查询已经脱离了我们原来的逻辑,我们是想要GROUP BY name
,结果应只出现两条数据。而不是GROUP BY name ,author
后的三条结果,那应该怎么做呢?
3. 解决
①:关闭sql_mode 的 only_full_group_by模式
only_full_group_by 要求 group by 后边必须写满 select 后边的非函数列,所以我们只需要关闭only_full_group_by即可,关闭方式又分为 临时关闭
和 永久关闭
- 临时关闭:临时关闭又分为
Session
级 和GLOBAL
级Session
:仅关闭当前会话设置,mysql重启后失效GLOBAL
:关闭全局设置,mysql重启后失效
- 永久关闭:永久关闭
only_full_group_by
模式,这种方法需要在mysql
的配置文件里修改,然后重启。- 找到配置文件/etc/my.cnf(或则关联文件夹找到mysql-server.cnf)
- 在上述文件内的[mysqld]后追加sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’
- 保存配置文件后,重启Mysql即可。
接下来演示一下关闭与打开Session
级的sql_mode.only_full_group_by
属性带来的影响!
查看 sql_mode
属性
- 查看
Session
级:SELECT @@sql_mode;
- 查看
GLOBAL
级:select @@GLOBAL.sql_mode;
查看Session
级的 sql_mode
属性,结果是可以看到带有ONLY_FULL_GROUP_BY
属性的,所以我们GROUP BY name
会报 1055
异常
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
接下来关闭Session
级的 sql_mode
属性
// 关闭 session级
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));// 关闭 GLOBAL级
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
再次select @@sql_mode;
查询发现 sql_mode
的值已经删除了ONLY_FULL_GROUP_BY
属性
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
然后再次执行如下sql
SELECT name,author,SUM(price) FROM `t_book`
GROUP BY name
执行结果:是按照我们的想法,返回了两条记录
注意
:查询结果中,select
后边的author
属性由于没有使用聚合函数,所以只会返回原数据表中的第一条数据,使用时请注意!原数据如下
②:使用 ANY_VALUE() 抑制 ONLY_FULL_GROUP_BY 的影响
如果不想关闭mysql的ONLY_FULL_GROUP_BY
全局设置,仅仅想让当前sql忽略其影响,则可以使用ANY_VALUE(cloum)
忽略ONLY_FULL_GROUP_BY
的影响,详见官方文档!
mysql8.0官网:ANY_VALUE(cloum) 可以抑制 ONLY_FULL_GROUP_BY 的影响
上面已经把ONLY_FULL_GROUP_BY
属性关闭了,接下来打开它:
// 打开`ONLY_FULL_GROUP_BY`属性SET SESSION sql_mode = sys.list_add(@@session.sql_mode, 'ONLY_FULL_GROUP_BY');
然后再去执行一下上面的sql,就会报1055
异常了
SELECT name,author,SUM(price) FROM `t_book`
GROUP BY name
使用 ANY_VALUE()
忽略ONLY_FULL_GROUP_BY
的影响:
SELECT name,ANY_VALUE(author),SUM(price) FROM `t_book`
GROUP BY name
结果如下:
正常出结果!
mysql 的 sql_mode.only_full_group_by属性解析相关推荐
- mysql 报错 sql_mode=only_full_group_by 解决方法
在服务器数据库查询使用了 GROUP BY 居然报出了 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contai ...
- MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
项目场景: 有时候,遇到数据库重复数据,需要将数据进行分组,并取出其中一条来展示,这时就需要用到group by语句. 但是,如果mysql是高版本,当执行group by时,select的字段不属于 ...
- mysql model only_full_group_by_MySql版本问题sql_mode=only_full_group_by的完美解决方案
1.查看sql_mode select @@sql_mode 查询出来的值为: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZE ...
- MySQL的sql_mode解析与设置
参考地址: http://blog.csdn.net/ccccalculator/article/details/70432123 因为在MySQL中使用group by 是总是出现1055的错误,这 ...
- mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by
在mysql 工具 搜索或者插入数据时报下面错误: ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause ...
- mysql查询报错: ORDER BY clause is not in GROUP BY..this is incompatible with sql_mode=only_full_group_by
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 我的情况 : Mysql 5.7.21 版本运行sql 报错如题,同样的 sql 直接本地运行不报错 ...
- MySQL报错this is incompatible with sql_mode=only_full_group_by
1.报错信息 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: In aggregated query without GROUP ...
- mysql升级到5.7版本后,运行程序报错this is incompatible with sql_mode=only_full_group_by
升级mysql后,运行程序报错 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains ...
- MySQL的sql_mode解析设置
MySQL的sql_mode解析设置 sql_mode定义了对Mysql中sql语句语法的校验规则! sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允 ...
最新文章
- 小狗钱钱_✅每次构建待办事项列表应用程序时,都会有一只小狗? 死了?
- helm3添加harbor仓库:带鉴权--username --password
- JVM堆内存控制/分代垃圾回收
- indexOf和binarySearch的对比
- python操作redis集群_python操作redis集群
- codeblocks和vscode编译时弹出不支持的16位程序解决方案
- PPT:华为数字化转型实践分享(附下载)
- python数据分析与展示 嵩天_【学习笔记】PYTHON数据分析与展示(北理工 嵩天)
- 学习游戏服务器编程进阶篇之全球同服技术架构
- 云控系统都支持哪些安卓手机装机步骤
- Python报错:local variable referenced before assignment
- 《红楼梦》中四大家族到底犯了什么罪,导致了「白茫茫大地真干净」的结局?
- 基于SSM的大学生创业众筹平台网站 毕业设计-附源码212000
- 寄云一站式平台支持起医疗大数据的构建与运营
- 玩安卓从 0 到 1 之架构思考
- 这是一个秘密,是一个秘密
- 今天来聊一聊互联网35岁梗,这个行业真的不需要35岁以上从业人员?
- CAD版本转换,手机该如何转换操作呢?
- heic格式的图片h5显示
- 11.21 CSS学习-上午