玩转Mysql系列 您所在的位置:网站首页 为什么平均分组有顺序 玩转Mysql系列

玩转Mysql系列

2024-07-03 20:37| 来源: 网络整理| 查看: 265

这是Mysql系列第9篇。

环境:mysql5.7.25,cmd命令中进行演示。

本篇内容 分组查询语法聚合函数单字段分组多字段分组分组前筛选数据分组后筛选数据where和having的区别分组后排序where & group by & having & order by & limit 一起协作mysql分组中的坑in多列查询的使用分组查询

语法:

说明: group_function:聚合函数。 group_by_expression:分组表达式,多个之间用逗号隔开。 group_condition:分组之后对数据进行过滤。 分组中,select后面只能有两种类型的列:

出现在group by后的列或者使用聚合函数的列聚合函数

函数名称

作用

max

查询指定列的最大值

min

查询指定列的最小值

count

统计查询结果的行数

sum

求和,返回指定列的总和

avg

求平均值,返回指定列数据的平均值

分组时,可以使用使用上面的聚合函数。

准备数据 单字段分组

需求:查询每个用户下单数量,输出:用户id、下单数量,如下:

多字段分组

需求:查询每个用户每年下单数量,输出字段:用户id、年份、下单数量,如下:

分组前筛选数据

分组前对数据进行筛选,使用where关键字

需求:需要查询2018年每个用户下单数量,输出:用户id、下单数量,如下:

分组后筛选数据

分组后对数据筛选,使用having关键字

需求:查询2018年订单数量大于1的用户,输出:用户id,下单数量,如下:

方式1:

方式2:

where和having的区别

where是在分组(聚合)前对记录进行筛选,而having是在分组结束后的结果里筛选,最后返回整个sql的查询结果。

可以把having理解为两级查询,即含having的查询操作先获得不含having子句时的sql查询结果表,然后在这个结果表上使用having条件筛选出符合的记录,最后返回这些记录,因此,having后是可以跟聚合函数的,并且这个聚集函数不必与select后面的聚集函数相同。

分组后排序

需求:获取每个用户最大金额,然后按照最大金额倒序,输出:用户id,最大金额,如下:

where & group by & having & order by & limit 一起协作

where、group by、having、order by、limit这些关键字一起使用时,先后顺序有明确的限制,语法如下:

注意: 写法上面必须按照上面的顺序来写。

示例:

需求:查询出2018年,下单数量大于等于2的,按照下单数量降序排序,最后只输出第1条记录,显示:用户id,下单数量,如下:

mysql分组中的坑

本文开头有介绍,分组中select后面的列只能有2种:

出现在group by后面的列使用聚合函数的列

oracle、sqlserver、db2中也是按照这种规范来的。

文中使用的是5.7版本,默认是按照这种规范来的。

mysql早期的一些版本,没有上面这些要求,select后面可以跟任何合法的列。

示例

需求:获取每个用户下单的最大金额及下单的年份,输出:用户id,最大金额,年份,写法如下:

上面的sql报错了,原因因为the_year不符合上面说的2条规则(select后面的列必须出现在group by中或者使用聚合函数),而sql_mode限制了这种规则,我们看一下sql_mode的配置:

sql_mode中包含了ONLY_FULL_GROUP_BY,这个表示select后面的列必须符合上面的说的2点规范。

可以将ONLY_FULL_GROUP_BY去掉,select后面就可以加任意列了,我们来看一下效果。

修改mysql中的my.ini文件:

重启mysql,再次运行,效果如下:

看一下上面的数据,第一条88.88的年份是2017年,我们再来看一下原始数据:

对比一下,user_id=1001、price=88.88是第3条数据,即the_year是2018年,但是上面的分组结果是2017年,结果和我们预期的不一致,此时mysql对这种未按照规范来的列,乱序了,mysql取的是第一条。

正确的写法,提供两种,如下:

上面第1种写法,比较少见,in中使用了多字段查询。

建议:在写分组查询的时候,最好按照标准的规范来写,select后面出现的列必须在group by中或者必须使用聚合函数。

总结 在写分组查询的时候,最好按照标准的规范来写,select后面出现的列必须在group by中或者必须使用聚合函数。select语法顺序:select、from、where、group by、having、order by、limit,顺序不能搞错了,否则报错。in多列查询的使用,下去可以试试

mysql系列大概有20多篇,喜欢的请关注一下,欢迎大家加我微信itsoku或者留言交流mysql相关技术!

路人甲Java:专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等)路人甲Java:专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有