公司的实习生小伙子不理解group by,我就发表一下自己的拙见,顺便当作笔记,日后常加翻阅。
记住下面三句话即可!
1、分组的作用就是为了做聚合,不聚合的分组有什么意义呢!
2、分组的select中“如果存在”字段,那么select中的字段必须和分组条件中的字段“完全一致”,否则查询出来的结果没有意义!
3、分组的聚合函数的参数可以是任何内容,不一定必须是分组条件中的字段!
-- 例子
mysql> select * from tb_user;
+----+------+--------+--------+
| id | name | gender | status |
+----+------+--------+--------+
| 1 | 张三 | 男 | 1 |
| 2 | 李四 | 女 | 1 |
| 3 | 王五 | 男 | 0 |
| 4 | 赵六 | 女 | 1 |
| 5 | 田七 | 男 | 0 |
+----+------+--------+--------+
-- 查询结果没有意义
mysql> select * from tb_user group by gender;
+----+------+--------+--------+
| id | name | gender | status |
+----+------+--------+--------+
| 2 | 李四 | 女 | 1 |
| 1 | 张三 | 男 | 1 |
+----+------+--------+--------+
-- 这么写是有一点意义的。就是可以看出gender字段的取值有几种,意义不大。
mysql> select gender from tb_user group by gender;
+--------+
| gender |
+--------+
| 女 |
| 男 |
+--------+
-- 查询结果没有意义
mysql> select gender,status from tb_user group by gender,status;
+--------+--------+
| gender | status |
+--------+--------+
| 女 | 1 |
| 男 | 0 |
| 男 | 1 |
+--------+--------+
-- 分组和聚合函数配合才有意义,下面是典型的分组查询
mysql> select gender,count(1) from tb_user group by gender;
+--------+----------+
| gender | count(1) |
+--------+----------+
| 女 | 2 |
| 男 | 3 |
+--------+----------+
-- select中没有group by后面的字段,查询结果无意义
mysql> select `name` from tb_user group by gender;
+------+
| name |
+------+
| 李四 |
| 张三 |
+------+
-- 这尼玛还是没有意义
mysql> select `name`,gender from tb_user group by gender;
+------+--------+
| name | gender |
+------+--------+
| 李四 | 女 |
| 张三 | 男 |
+------+--------+
-- select后面如果有字段,就必须和group by后面的字段完全一致。下面不一致,查询结果没有意义。
-- 下面的count()函数的参数不用非得写为gender,因为count()计算的是每组的所有记录。
-- group by是将一个表拆分成多个表,聚合函数是将多条记录合并成一条结果集。因此分组之后count(),就计算出了每组一共多少条记录。
mysql> select `name`,gender,count(1) from tb_user group by gender;
+------+--------+----------+
| name | gender | count(1) |
+------+--------+----------+
| 李四 | 女 | 2 |
| 张三 | 男 | 3 |
+------+--------+----------+
-- 下面是一个典型的分组语句。
-- select后面“如果有”字段,那么必须和group by的字段“完全一致”。
-- 分组的聚合函数中可以写任何内容,就当作一张完整的小表来进行聚合即可。
-- 见下图。
mysql> select gender,count(1) from tb_user group by gender;
+--------+----------+
| gender | count(1) |
+--------+----------+
| 女 | 2 |
| 男 | 3 |
+--------+----------+
- 一张图理解group by