在数据库操作中我们需要对查询到的数据进行分组,那么我们就需要用到 group by,但是由于 mysql 的语法宽松,尽量不要在分组的时候放入没有意义的字段到分组中,使用数据也要以组的形式去使用。
``` group by: 对查询到的数据,以给定的字段进行分组,结果就是将数据数据分成若干份, 每组作为一个"整体"成为一行数据。
可以单个字端分组,也可以多个 select * from test group by name; select * from test group by name, age;
测试数据: mysql> select * from test; +----+------+------+ | id | name | age | +----+------+------+ | 1 | dzm | 20 | | 2 | xyq | 20 | | 3 | xyq | 20 | | 4 | djy | 5 | | 5 | NULL | NULL | +----+------+------+ ```
``` 我们这里相当于指定用 name 来进行分组,也就是每一个不同值的 name 都是一个新组 mysql> select * from test group by name; +----+------+------+ | id | name | age | +----+------+------+ | 5 | NULL | NULL | | 4 | djy | 5 | | 1 | dzm | 20 | | 2 | xyq | 20 | +----+------+------+
我们这里相当于指定用 age 来进行分组,也就是每一个不同值的 age 都是一个新组 而且从数据显示来看,只会显示出来在最前面的那条数据,后面的 xyq 也是 20 但是这里只显示出 dzm 这一栏就截止了 mysql> select * from test group by age; +----+------+------+ | id | name | age | +----+------+------+ | 5 | NULL | NULL | | 4 | djy | 5 | | 1 | dzm | 20 | +----+------+------+
这里是以两个字段来进行分组,会发现 xyq 这一栏就只剩下一个了,其他还在,因为就 xyq 这一栏这两个字段值一样,所以就被保留了一份 mysql> select * from test group by name, age; +----+------+------+ | id | name | age | +----+------+------+ | 5 | NULL | NULL | | 4 | djy | 5 | | 1 | dzm | 20 | | 2 | xyq | 20 | +----+------+------+
常用计算 count() avg() max() min() sum() mysql> select name, count() as 数量, avg(age) as 平均年龄, max(age) as 最大年龄, min(age) as 最小年龄, sum(age) as 累计年龄和 from test group by name; +------+--------+--------------+--------------+--------------+-----------------+ | name | 数量 | 平均年龄 | 最大年龄 | 最小年龄 | 累计年龄和 | +------+--------+--------------+--------------+--------------+-----------------+ | NULL | 1 | NULL | NULL | NULL | NULL | | djy | 1 | 5.0000 | 5 | 5 | 5 | | dzm | 1 | 20.0000 | 20 | 20 | 20 | | xyq | 2 | 20.0000 | 20 | 20 | 40 | +------+--------+--------------+--------------+--------------+-----------------+ ```
- 使用 group by 报错,原因:是在 Mysql5.7 下 sqlmode 默认为 ONLY_FULL_GROUP_BY,解决方案:Mysql (ONLYFULLGROUPBY) Expression #1 of SELECT list is not in GROUP BY ...