一、查询
1. group by
1)分组原理
- 分组之前
select * from score;
+------+------+-------+
| s_id | c_id | score |
+------+------+-------+
| 01 | 01 | 80 |
| 01 | 02 | 90 |
| 01 | 03 | 99 |
| 02 | 01 | 70 |
| 02 | 02 | 60 |
| 02 | 03 | 80 |
| 03 | 01 | 80 |
| 03 | 02 | 80 |
| 03 | 03 | 80 |
| 04 | 01 | 50 |
| 04 | 02 | 30 |
| 04 | 03 | 20 |
| 05 | 01 | 76 |
| 05 | 02 | 87 |
| 06 | 01 | 31 |
| 06 | 03 | 34 |
| 07 | 02 | 89 |
| 07 | 03 | 98 |
+------+------+-------+
18 rows in set (0.00 sec)
- 按照s_id分组之后
select s_id,group_concat(c_id) c_id,group_concat(score) score
from score
group by s_id
;
+------+----------+----------+
| s_id | c_id | score |
+------+----------+----------+
| 01 | 01,02,03 | 80,90,99 |
| 02 | 03,02,01 | 80,60,70 |
| 03 | 01,02,03 | 80,80,80 |
| 04 | 03,02,01 | 20,30,50 |
| 05 | 01,02 | 76,87 |
| 06 | 01,03 | 31,34 |
| 07 | 02,03 | 89,98 |
+------+----------+----------+
7 rows in set (0.00 sec)
// s_id中相同的值为一组
// s_id每一组中,与之匹配的c_id的值为一组;与之匹配的score的值为一组
// 该查询结果共有7组:01一行一组,02一行一组,03……
-- 按照某列分组,则该列相同的值为一组;与该列中每组的值相匹配的其他列的值为一组。
- 单独使用关键字group by查询,结果只显示每组的一条记录。
select s_id,c_id,score
from score
group by s_id
;
+------+------+-------+
| s_id | c_id | score |
+------+------+-------+
| 01 | 01 | 80 |
| 02 | 01 | 70 |
| 03 | 01 | 80 |
| 04 | 01 | 50 |
| 05 | 01 | 76 |
| 06 | 01 | 31 |
| 07 | 02 | 89 |
+------+------+-------+
7 rows in set (0.00 sec)
2)分组查询需要注意的
- 分组的列必须包含在查询的列中即查询时必须要查分组的列。
举例子
select group_concat(c_id) c_id,group_concat(score) score
from score
group by s_id
;
+----------+----------+
| c_id | score |
+----------+----------+
| 01,02,03 | 80,90,99 |
| 03,02,01 | 80,60,70 |
| 01,02,03 | 80,80,80 |
| 03,02,01 | 20,30,50 |
| 01,02 | 76,87 |
| 01,03 | 31,34 |
| 02,03 | 89,98 |
+----------+----------+
7 rows in set (0.00 sec)
reason1:一列中,一条记录应该是一个值。既然3个值说明分组了,按照什么分组呢,应该显示出来。
reason2:如果只是查分组之外的列,完全可以直接查,不需要分组,与分组操作矛盾。
二、聚合函数
1. count()函数
1)参数
- “*” 返回选择集合中所有行的数目,包含NULL值的行。
- 除了 “*” 以外的任何参数,返回选择集合中非NULL值的行的数目。