文章目录

  • 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的配置文件里修改,然后重启。
    1. 找到配置文件/etc/my.cnf(或则关联文件夹找到mysql-server.cnf)
    2. 在上述文件内的[mysqld]后追加sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’
    3. 保存配置文件后,重启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属性解析相关推荐

  1. mysql 报错 sql_mode=only_full_group_by 解决方法

    在服务器数据库查询使用了 GROUP BY 居然报出了 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contai ...

  2. MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案

    项目场景: 有时候,遇到数据库重复数据,需要将数据进行分组,并取出其中一条来展示,这时就需要用到group by语句. 但是,如果mysql是高版本,当执行group by时,select的字段不属于 ...

  3. 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 ...

  4. MySQL的sql_mode解析与设置

    参考地址: http://blog.csdn.net/ccccalculator/article/details/70432123 因为在MySQL中使用group by 是总是出现1055的错误,这 ...

  5. 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 ...

  6. 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 直接本地运行不报错 ...

  7. MySQL报错this is incompatible with sql_mode=only_full_group_by

    1.报错信息 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: In aggregated query without GROUP ...

  8. 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 ...

  9. MySQL的sql_mode解析设置

    MySQL的sql_mode解析设置 sql_mode定义了对Mysql中sql语句语法的校验规则! sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允 ...

最新文章

  1. 小狗钱钱_✅每次构建待办事项列表应用程序时,都会有一只小狗? 死了?
  2. helm3添加harbor仓库:带鉴权--username --password
  3. JVM堆内存控制/分代垃圾回收
  4. indexOf和binarySearch的对比
  5. python操作redis集群_python操作redis集群
  6. codeblocks和vscode编译时弹出不支持的16位程序解决方案
  7. PPT:华为数字化转型实践分享(附下载)
  8. python数据分析与展示 嵩天_【学习笔记】PYTHON数据分析与展示(北理工 嵩天)
  9. 学习游戏服务器编程进阶篇之全球同服技术架构
  10. 云控系统都支持哪些安卓手机装机步骤
  11. Python报错:local variable referenced before assignment
  12. 《红楼梦》中四大家族到底犯了什么罪,导致了「白茫茫大地真干净」的结局?
  13. 基于SSM的大学生创业众筹平台网站 毕业设计-附源码212000
  14. 寄云一站式平台支持起医疗大数据的构建与运营
  15. 玩安卓从 0 到 1 之架构思考
  16. 这是一个秘密,是一个秘密
  17. 今天来聊一聊互联网35岁梗,这个行业真的不需要35岁以上从业人员?
  18. CAD版本转换,手机该如何转换操作呢?
  19. heic格式的图片h5显示
  20. 11.21 CSS学习-上午

热门文章

  1. leetcodeT14-最长公共前缀(两种解法+图解)
  2. Markdown入门指导
  3. 作用域经典练习题(主要是这个图太大不能一起分享)
  4. 今日SGU 5.20
  5. springmvc注解入门程序
  6. js中使用new Date(str)创建时间对象不兼容firefox和ie的解决方式
  7. 皕杰报表和炎黄盈动(AWS BPM)集成 操作手册
  8. 洛谷——P1109 学生分组
  9. 摄像机旋转约束问题及解决
  10. Spring学习笔记002 - AOP