GROUP BY dept,name 的意思,就是先按dqpt分组,如果出现dept相同的,再按name分组,也就是说除非出现dept和name都相同的记录才会合为一组,否则的话是不会合在一起的,这样的话显示出的name就只有一个了。
创新互联建站-专业网站定制、快速模板网站建设、高性价比清丰网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式清丰网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖清丰地区。费用合理售后完善,十载实体公司更值得信赖。
你用现实生活中的例子来理解一下就很明白啦:比如说你们班上的同学如果按性别来分组,可以分为两组,如果按照姓名来分组,那就基本上有多少个同学就有多少组(除非有同名同姓的),那如果按性别和姓名同时分组呢,那分的组就是同学数的两倍了,即“男的张三”一组,“女的张三”一组,“男的李四”一组,“女的李四”一组……当然,这其中有一半的组是空的,剩下的也是每一组只有一个人啊!理解没有?
所以 Group by 后面的分组字段不是随便加的,多个字段的分组是需要排列组合的,分的组数会按几何级数增长!
补充说一句:本来按名字来分组就是个愚不可及的想法了!更何况还要加上其他分组条件,这样的话基本上就是一组只有一个了!
上一篇聚合函数末尾处使用了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不规则条形图
你按性别分组,因为性别就两个值,所以出来的肯定是两条结果,男一组女一组,这就是分组的意义。分组要和聚簇函数配合使用。
比如你想看男/女各有多少个,select sex,count(sex) from student group by sex; 得到的也是两条,男多少,女多少。
至于你想查出所有学生,那和分组没关系啊。或者你按学生姓名分组,这样有多少学生就有多少组,但这样还不如直接查全表呢。
select 性别,
case when 年龄 between 20 and 29 then 1 else 0 end [20-29],
case when 年龄 between 30 and 39 then 1 else 0 end [30-39],
case when 年龄 between 40 and 49 then 1 else 0 end [40-49]
from 表名
group by 性别
以上使用于大部分数据库
只是在起别名上,只适用于sqlserver
oracle的话起别名
select 性别,
case when 年龄 between 20 and 29 then 1 else 0 end "20-29",
case when 年龄 between 30 and 39 then 1 else 0 end "30-39",
case when 年龄 between 40 and 49 then 1 else 0 end "40-49"
from 表名
group by 性别
mysql的话
select 性别,
case when 年龄 between 20 and 29 then 1 else 0 end `20-29,
case when 年龄 between 30 and 39 then 1 else 0 end `30-39`,
case when 年龄 between 40 and 49 then 1 else 0 end `40-49
from 表名
group by 性别