mysql-group by原理

一、查询

1. group by

1)分组原理

  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)
  1. 按照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……
-- 按照某列分组,则该列相同的值为一组;与该列中每组的值相匹配的其他列的值为一组。
  1. 单独使用关键字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)分组查询需要注意的

  1. 分组的列必须包含在查询的列中即查询时必须要查分组的列。

举例子

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)参数

  1. “*” 返回选择集合中所有行的数目,包含NULL值的行。
  2. 除了 “*” 以外的任何参数,返回选择集合中非NULL值的行的数目。

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值