第九章:第17节 MySQL基础篇——数据查询语言DQL(基本查询三)group by子句

更新于:2017-07-27 15:05:43

1.png

看上图的查询结果,edu字段和address字段是不是有些记录的值都是一样的,在select语句中可以用group by子句按照某一个字段的值为所有记录分组。


group  by  分组子句

形式:

group  by  字段1  排序方式1,字段2 排序方式2, .....

通常都只进行一个字段的分组。


含义:

什么叫分组?就是将数据以某个字段的值为“依据”,分到不同的“组别”里。


比如一个班的学生信息,可以按省份进行分组,或按年龄分组,或按性别分组。要知道,分组完之后,结果集是某种“组”,可以理解为“小组”,其数量可能会急剧减少。比如全班60多个同学,如果按“省”分组,也许就只有10多个“组”了。如果按年龄分组,也许就只有7-8个组了(大约从20岁到26岁)。如果按性别分组,就只有2组了。即使公安部的全国10几亿的身份证信息,如果按年龄分组,最终也只能得到100多条的记录。


group by 子句就是用于将前面取得的数据进行某种“分组”操作。


分组的结果通常:


1、数据结果只能是“组”——没有数据本身的个体


1.png


当我们按照“address”分组以后,好像是相同的“address”只显示一个,比如id是25的“address”也是“东北”就没有显示。


原因是这样的:按照“address”分组后,id为15、25的两条记录划入同一组,可这两条记录除了“address”其他字段的值都不一样,MySQL只能显示“最先入组(最先显示)”的那条记录代表整个组。


说白了,分组后只能显示每个组的第一条记录。有朋友会觉得group by除了可以查看总共分多少组那还有什么用?


还可以查看一个组的聚合信息


什么是聚合信息?


比如:平均值、总个数、总和、最大值、最小值。


怎么查看聚合信息?


需要用到聚合函数。常用聚合函数有:取平均值avg(), 取个数count(), 取总和sum(),取最大值max(), 取最小值min()


1.png


需要聚合哪个字段的信息就把字段名放入函数里执行。


为字段起个别名:


1.png


说下起别名:字段名 as 别名,也可以直接在字段名后面跟上新别名。


2、如果是2个字段或以上分组,则其实是相当于对前一分组的组内,再进行后一依据的分组。

1.png


排序的两个关键字:ASC和DESC


ASC或DESC表示对该分组的字段同时进行排序,可以省略,则默认是ASC(正序)。DESC表示倒序,在order by子句中也会用到。


加上desc

1.png


和下面一比较



排序是不是反过来了。


额外说明:第13节我们学了一个SQL语句 显示表结构 desc  表名;

1.png


这里的desc与排序的desc完全两回事。


group by子句总结:


分组查询如果用不到索引应该很费资源的,可能会做全表扫描。起码楠神在实际开发中很少有分组查询的需求,但不代表group by就不重要了,偶尔有需求了还得用到。


本节学习代码》》》