资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

mysql怎么进行分组 MySQL 分组

MySQL分组、排序

上一篇聚合函数末尾处使用了GROUP BY,但没有做具体的介绍,这一篇就主要介绍一下GROUP BY的使用方法。顺便介绍一下对分组查询的过滤关键词HAVING的用法。

在上饶等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、成都网站制作 网站设计制作按需定制,公司网站建设,企业网站建设,成都品牌网站建设,网络营销推广,成都外贸网站建设,上饶网站建设费用合理。

在MySQL中,GROUP BY关键词可以根据一个或多个字段对查询结果进行分组,类似于Excel中的数据透视表。可以单独使用,但一般情况下都是结合聚合函数来使用的。

语法格式如下:

下面演示都是基于这一张简单的省份对应大区的表格。

【单独使用GROUP BY】

单独使用GROUP BY关键字时,查询结果会只显示每个分组的第一条记录。

根据省份表里面的大区进行聚合,查询全国共分成了几个大区,SQL语句如下↓

【GROUP BY结合聚合函数】

5个聚合函数上一篇已经详细介绍了用法,GROUP BY和聚合函数结合使用也是最频繁的,下面就继续使用省份表来求每个大区有多少个省份,对应的聚合函数就是COUNT函数,SQL语句如下↓

【GROUP BY结合GROUP_CONCAT】

这还是一个很有用的功能,GROUP_CONCAT() 函数会把每个分组的字段值都合并成一行显示出来。

下面继续使用省份表,把每个大区对应的省份放在一行展示,用分号分开,SQL语句如下↓

【GROUP BY结合WITH ROLLUP】

WITH POLLUP关键词用来在所有记录的最后加上一条记录,这条记录是上面所有记录的总和,SQL语句如下↓

【GROUP BY结合HAVING】

在MySQL中,可以使用HAVING关键字对分组后的数据进行过滤。

使用 HAVING 关键字的语法格式如下:

HAVING关键词和WHERE关键词都可以用来过滤数据,且HAVING支持WHERE关键词中所有的操作符和语法。但是WHERE和HAVING关键字也存在以下几点差异:

下面筛选一下省份数量在7个及以上的大区,SQL语句如下↓

【GROUP BY结合ORDER BY】

聚合后的数据,一半情况下也是需要进行排序的,通过ORDER BY对聚合查询结果进行排序,对省份数量按从大到小进行排序,SQL语句如下↓

End

◆ PowerBI开场白

◆ Python高德地图可视化

◆ Python不规则条形图

MySQL常用分组统计汇总

指定测试结果表中根据 case_id 和 sort 字段进行分组,取同一分组中的执行最小时间作为该条用例的开始执行时间,取同一分组中的执行最大时间作为该条用例的结束执行时间。

因为一个测试集可能有多条相同用例,用 sort 作为区分,case_id 和 sort 两个字段一起可以唯一确定执行的是哪一条用例,因此这里需要指定两个字段。

执行结果如下图所示:

根据 case_id 和 sort 字段进行分组,每个分组中取最大状态值作为用例的最终状态。

因为一条用例可能有多个设备执行,每个设备返回的状态值可能不同,这里取最大值作为整条用例的最终状态值。

执行结果如下图所示:

三、MySQL数据库之分组排序

第二节为大家介绍了数据的查询,这一小节为大家深入讲解查询过程中的数据分组和排序,分组关键字为:group by,排序关键字为:order by,过滤分组的关键字为:having;

group by:对查询的数据按照某一类型进行分组, group by 一般用在order by子句之前,where子句之后

order by:对查询的数据进行某一类进行排序 或 对分组后的数据进行排序

having:对分组后的数据进行条件过滤

继续以上一章创建的客户表为例,表名: customer ,表有列: cus_id,cus_no,cus_name,cus_age,cus_adds。

eg:查询客户的基本信息,以id进行分组: select cus_id,count(*) as num from customer group by cus_id;  num表示对应的cus_id有多少客户数据, 查询结果如下

如果分组的列中有null值,那么null将作为一个分组返回,如果有多个行都为null值,它们将会被分为一组返回。 group by 必须用在where子句之后,order by子句之前。

除group by可以进行分组过滤数据外,having也可以进行过滤分组;having过滤和where类似,唯一区别在于where是过滤行,而having是过滤分组,可看以下列子:

eg: 查询以id分组后数据总量两条以上的数据: select cus_id,count(*) as num from customer group by cus_id having count(*) = '2'; 满足条件的就只有一条数据

order by主要用于数据排序的情况,当查询数据量较大时,有序的数据会让人更好地直观观察数据,order by 关键字用于对结果集按照一个列或者多个列进行排序。此外order by 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。使用方法如下

eg:查询客户的基本信息,以年龄进行排序,默认升序:select * from customer order by cus_age;

eg:查询客户的基本信息,以年龄进行排序,降序方式排序:select * from customer order by cus_age DESC;

升序使用ASC,降序使用DESC,系统默认为升序。注意两者之间的差异

当对多个列进行排序时,order by使用方法如下:

order by A,B   --过滤数据都是默认按升序排列

order by A desc,B   --过滤数据时 A 降序,B 升序排列

order by A ,B desc   --过滤数据时 A 升序,B 降序排列

desc 或者 asc 只对它紧跟着的第一个列名有效,其他不受影响,仍然是默认的升序。

本小节介绍排序分组就到这里了,通过多分组排序的介绍,知道了group by,order by,having三者之间的差异和区别,大家可以在自己电脑多编写几个脚本,深入了解三个关键字的使用。

MySQL 怎样分组查询

MySQL GROUP BY 子句

GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

具体语法参考:

from 树懒学堂 - 一站式数据知识平台

Mysql语法之分组数据

如何分组数据,以便能汇总表内容的子集。这涉及两个新SELECT语句子句,分别是GROUP BY子句和HAVING子句。

分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。

分组是在SELECT语句的GROUP BY 子句中建立的。

来看例子理解:

mysqlselect vend_id,COUNT(*) AS num_prods from products group by vend_id;

也就是不同的Id的商品总数都能分别查出来。

除了能用GROUP BY分组数据外,Mysql还允许过滤分组,规定包括哪些分组,排除哪些分组。

也就是HAVING子句。

mysqlselect cust_id,COUNT( /) AS orders from orders uGROUP BY/u cust_id uHAVING/u COUNT( /) =2;

注意:这里HAVING换成WHERE是不管用的。HAVING针对于分组。

WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。

那么咱么看看怎么混合WHERE和HAVING。

mysqlselect vend_id, COUNT( / ) AS num_prods from products uwhere prod_price=10 group by/u vend_id HAVING COUNT( /) =2;

mysqlselect order_num,SUM(quantity*item_price) AS ordertotal

from orderitems

GROUP BY order_num

HAVING SUM(quantity*item_price) =50

order by ordertotal;

技术分享 | MySQL 分组需求探秘

前两天同事有个 MySQL 数据分组的需求,如下测试数据,需要找出每个 name 分组中 create_date 最近的记录:

需要注意的是,此处用的 MySQL 是5.6,最初是使用这条语句:

pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;" select name, value, create_date, update_date from t1 group by name order by create_date desc; /pre

用这条 SQL 得到的其实只是每个 name 分组中最先插入的记录,然后按照 create_date 进行了降序排列,和原始需求,完全不同。

此时可采用分而治之的策略,先做排序,再做分组:

pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;" select * from (select name, value, create_date, update_date from t1 order by create_date desc) t group by t.name; /pre

当然,针对此需求,可能有其他方法,有兴趣的朋友,可以尝试写写,共享一下。

可能有细心的朋友会发现个问题,就是上述 SQL 中的 group by ,好像有些奇怪,如果按照常规,select 中的字段需要出现在 group by 中,上述语句竟然没报错?

如果我们在 MySQL 5.7 执行相同的语句:

pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;" select name, value, create_date, update_date from t1 group by name order by create_date desc; /pre

因此从5.6升级到5.7,很可能出现这种相同的 SQL 执行结果不同的现象,这对兼容性测试的要求就会很高,究其原因,一方面是特性决定的,另一方面就是各种配置参数不同导致的。

可以在5.7的 sql_mode 中删除这个 ONLY_FULL_GROUP_BY ,即可达到5.6相同效果了,或者改写 SQL ,例如:

pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;" select * from t1 a where create_date = (select max(create_date) from t1 b where a.name = b.name); /pre

或者,

pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;" select * from t1 a where not exists (select * from t1 b where a.name = b.name and b.create_date a.create_date); /pre

MySQL 8.0支持 row_number()函数,操作应该和如下 Oracle 相近的。

Oracle 中可以使用 row_number()实现此需求:

pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;" select * from (select name, create_date, row_number() over (partition by name order by create_date desc) as r from t1) where r=1; /pre


网站栏目:mysql怎么进行分组 MySQL 分组
网址分享:http://cdkjz.cn/article/dodesho.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220