在数据库操作中我们需要对查询到的数据进行分组,那么我们就需要用到 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 下 sql_mode 默认为
ONLY_FULL_GROUP_BY,解决方案:Mysql (ONLY_FULL_GROUP_BY) Expression #1 of SELECT list is not in GROUP BY ...