only_full_group_by问题而引发的对group by的深入思考
问题背景
最近在项目中使用mysql的group by进行分组查询的场景比较多,其中一次遇到了一个问题,即在开发环境执行一个如下sql时是正确且可执行的,
select a,b,max(c) from test_tbl group by a
但是放到了测试环境就会报如下的错误。
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'your_tbl...' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解决办法
因为开发环境和测试环境所使用的mysql数据库的版本不一样,开发环境使用的时候5.6.x而测试环境使用的是5.7.x,而在Mysql的5.7.x版本中默认是开启sql_mode = only_full_group_by。
而在这个模式下,我们使用分组查询时,出现在select字段后面的只能是group by后面的分组字段,或使用聚合函数包裹着的字段。
在上面的sql中,字段b既不是group by里面的分组字段,也没有被聚合函数包裹着。5.7以下的版本不进行检查,而5.7以上的版本进行了sql_mode=only_full_group_by的检查,所以会出现以上的问题,当然解决方法也很简单,将b也纳入到分组字段中即可。
group by深入思考
虽然在工作中会频繁的使用到group by进行分组查询,但自己对数据分组这个概念一直很模糊,这次就借着这个机会,通过一个简单的示例来帮助大家在脑海中建立起来数据分组这个抽象概念。
我们创建一张如下的数据表
CREATE TABLE `product` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`product_name` varchar(100) NOT NULL COMMENT '商品名称',
`brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名称',
`category_name` varchar(100) NOT NULL COMMENT '商品分类',
`price` decimal(10,4) NOT NULL COMMENT '价格'
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='测试用的商品表';
表中有如下数据
mysql> select * from product;
+----+---------------+------------+---------------+-------+
| id | product_name | brand_name | category_name | price |
+----+---------------+------------+---------------+-------+
| 1 | XiaoMi6X | XiaoMi | 手机 | 2999 |
| 2 | XiaoAi | Lenovo | 电脑 | 8999 |
| 3 | HUAWEI K1 | HUAWEI | 手机 | 1999 |
| 4 | iPhone X | iPhone | 手机 | 9999 |
| 5 | MacBook Pro | Mac | 电脑 | 13999 |
| 6 | iPhone XMAX | iPhone | 手机 | 10999 |
| 7 | HUAWEI Mate20 | HUAWEI | 手机 | 2999 |
+----+---------------+------------+---------------+-------+
7 rows in set
一个最高价
我们使用group by按照品牌类目(category_name)进行分组,并获取该分组中的最高价格。
mysql> select category_name,max(price) from product group by category_name;
+---------------+------------+
| category_name | max(price) |
+---------------+------------+
| 手机 | 10999 |
| 电脑 | 13999 |
+---------------+------------+
2 rows in set
这个简单的分组sql相信也难不倒大家,那么让我们来看看这个分组查询语句是如何取到最终结果的。
过程:如下图所示,首先从数据集中筛选出来类目为手机的所有记录(以蓝色线框标明)和类目为电脑的所有记录(以红色线框标明)并将这些记录归集到一起,那么分组之后就出现了以不同类目进行划分的两个数据集,然后再从各自的数据集中选出最高的价格便可得到最终的结果。

一个最低价
再举一个例子,我们用品牌名称brand_name进行分组,并使用聚合函数算出该品牌下的最低价格。
mysql> select brand_name,min(price) from product group by brand_name;
+------------+------------+
| brand_name | min(price) |
+------------+------------+
| HUAWEI | 1999 |
| iPhone | 9999 |
| Lenovo | 8999 |
| Mac | 13999 |
| XiaoMi | 2999 |
+------------+------------+
5 rows in set
过程:如下图所示,从数据集中按照品牌名称brand_name进行分组,然后按照品牌名称就筛选出了一共五组品牌,然后再从各自品牌中选出最低价格便可得到最终结果。

后记总结
取经归来后,愈发的觉得无论生活还是技术都应该持有一种脱离表层、向往深层的探索追求精神,在这个过程中我会不断的总结分享,与诸君共勉!
only_full_group_by问题而引发的对group by的深入思考的更多相关文章
- 由linux下的多进程编程引发的关于进程间隔离的思考
源代码放到了三个文件中: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include & ...
- 由html,body{height:100%}引发的对html和body的思考
html,body{height:100%} 今天看到一个CSS样式:html,body{height:100%},第一次看到,感觉挺奇怪,为什么html还需要设置height:100%呢,html不 ...
- 从一个小例子引发的Java内存可见性的简单思考和猜想以及DCL单例模式中的volatile的核心作用
环境 OS Win10 CPU 4核8线程 IDE IntelliJ IDEA 2019.3 JDK 1.8 -server模式 场景 最初的代码 一个线程A根据flag的值执行死循环,另一个线程B只 ...
- 关于Mysql5.7高版本group by新特性报错
一个项目的开发到测试上线运营,团队对项目的管理不成熟会影响项目的开发效率.由于项目是我刚接手,独自在Centos搭建PHP环境,所以就考虑使用高版本,选择了Mysql5.7,本地开发环境还是Windo ...
- mysql5.7.X版本only_full_group_by问题解决
一.出错原因 最近因为开发数据库与部署数据库版本不同,带来了几个问题,其中only_full_group_by问题是之前没有遇到的. 具体报错如下 [Err] 1055 - Expression #1 ...
- Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: ..... this is incompatible with sql_mode=only_full_group_by
一.异常信息 org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: com.mysq ...
- mysql only_full_group_by报错的问题(转)
原文:https://www.cnblogs.com/jim2016/p/6322703.html 在mysql 工具 搜索或者插入数据时报下面错误: ERROR 1055 (42000): Expr ...
- !!!sql_mode=only_full_group_by配置
Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'invoicecer ...
- 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 ...
随机推荐
- windows中安装pip,setuptools,django等
1,安装Python3.6 (下载exe文件,双击安装) 注意设置环境变量,让Python的在任意位置都可以执行 .Python 下载地址:https://www.python.org/do ...
- FAX modem和传真协议简介
FAX就是传真,传真通信是使用传真机,借助公用通信网或其他通信线路传送图片,文字等信息,并在接收方获得发送原件系统的副本的一种通信方式.传真通信是现代图像通信的重要组成部分,它是目前采用公用电话网传送 ...
- HTML5 Canvas 画纸飞机组件
纸飞机模拟一个物体在规定设计轴线偏离方位. //三角形 function DrawTriangle(canvas, A, B, C) { //画个三角形,“A.B.C”是顶点 with (canvas ...
- angular开发控制器之间的通信
一.指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式(单例模式) 二.基于scope继承的方式: 最简单的让控制器之间进行通信的方法 ...
- Bagging和Boosting的概念与区别
随机森林属于集成学习(ensemble learning)中的bagging算法,在集成算法中主要分为bagging算法与boosting算法, Bagging算法(套袋发) bagging的算法过程 ...
- Java开发之上帝之眼系列教程前言&目录
前言 如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝的角度去观察(了解)Java体系. ...
- 深圳MPD大会,五大专题一会尽享
深圳MPD大会,五大专题一会尽享 2013年9月,深圳的高温将慢慢褪去,炎炎夏日也会变得稍微清凉一些.但9月It届的峰会活动却没有丝毫的锐减.9月7-8日深圳将迎来MPD大会2013的收官之站. MP ...
- 查询ip
ifconfig | grep "inet " | grep -v 127.0.0.1
- POJ 2987 - Firing - [最大权闭合子图]
题目链接:http://poj.org/problem?id=2987 Time Limit: 5000MS Memory Limit: 131072K Description You’ve fina ...
- 冒泡排序之python
冒泡排序(Bubble sort) 两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止. 1.算法描述: 比较相邻的元素.如果第一个比第二个大,就交换它们两个: 对每一对相邻元素作同样的工 ...