看上图的查询结果,edu字段和address字段是不是有些记录的值都是一样的,在select语句中可以用group by子句按照某一个字段的值为所有记录分组。
形式:
group by 字段1 排序方式1,字段2 排序方式2, .....
通常都只进行一个字段的分组。
含义:
什么叫分组?就是将数据以某个字段的值为“依据”,分到不同的“组别”里。
比如一个班的学生信息,可以按省份进行分组,或按年龄分组,或按性别分组。要知道,分组完之后,结果集是某种“组”,可以理解为“小组”,其数量可能会急剧减少。比如全班60多个同学,如果按“省”分组,也许就只有10多个“组”了。如果按年龄分组,也许就只有7-8个组了(大约从20岁到26岁)。如果按性别分组,就只有2组了。即使公安部的全国10几亿的身份证信息,如果按年龄分组,最终也只能得到100多条的记录。
group by 子句就是用于将前面取得的数据进行某种“分组”操作。
分组的结果通常:
1、数据结果只能是“组”——没有数据本身的个体
当我们按照“address”分组以后,好像是相同的“address”只显示一个,比如id是25的“address”也是“东北”就没有显示。
原因是这样的:按照“address”分组后,id为15、25的两条记录划入同一组,可这两条记录除了“address”其他字段的值都不一样,MySQL只能显示“最先入组(最先显示)”的那条记录代表整个组。
说白了,分组后只能显示每个组的第一条记录。有朋友会觉得group by除了可以查看总共分多少组那还有什么用?
还可以查看一个组的聚合信息。
什么是聚合信息?
比如:平均值、总个数、总和、最大值、最小值。
怎么查看聚合信息?
需要用到聚合函数。常用聚合函数有:取平均值avg(), 取个数count(), 取总和sum(),取最大值max(), 取最小值min()。
需要聚合哪个字段的信息就把字段名放入函数里执行。
为字段起个别名:
说下起别名:字段名 as 别名,也可以直接在字段名后面跟上新别名。
2、如果是2个字段或以上分组,则其实是相当于对前一分组的组内,再进行后一依据的分组。
排序的两个关键字:ASC和DESC
ASC或DESC表示对该分组的字段同时进行排序,可以省略,则默认是ASC(正序)。DESC表示倒序,在order by子句中也会用到。
加上desc
和下面一比较
排序是不是反过来了。
额外说明:第13节我们学了一个SQL语句 显示表结构 desc 表名;
这里的desc与排序的desc完全两回事。
group by子句总结:
分组查询如果用不到索引应该很费资源的,可能会做全表扫描。起码楠神在实际开发中很少有分组查询的需求,但不代表group by就不重要了,偶尔有需求了还得用到。