MySql group by 分组

824 阅读2分钟

在数据库操作中我们需要对查询到的数据进行分组,那么我们就需要用到 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 |
+------+--------+--------------+--------------+--------------+-----------------+