电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 1891 人浏览分享

mysql中groupby的使用示例:聚合分组

[复制链接]
1891 0

来看这样一个表:

  1. mysql> show create table tb_student;
  2. +------------+---------------------------------------------------------------------
  3. ----------------------------------------------------------------+
  4. | Table      | Create Table                                                                                                                        |
  5. +------------+--------------------------------------------------------------------
  6. -----------------------------------------------------------------+
  7. | tb_student | CREATE TABLE `tb_student` (
  8.   `name` varchar(64) NOT NULL,
  9.   `score` int(10) unsigned NOT NULL
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  11. +------------+------------------------------------------------------------
  12. -------------------------------------------------------------------------+
  13. 1 row in set (0.00 sec)

  14. mysql>
  15. mysql>
  16. mysql>
  17. mysql> desc tb_student;
  18. +-------+------------------+------+-----+---------+-------+
  19. | Field | Type             | Null | Key | Default | Extra |
  20. +-------+------------------+------+-----+---------+-------+
  21. | name  | varchar(64)      | NO   |     | NULL    |       |
  22. | score | int(10) unsigned | NO   |     | NULL    |       |
  23. +-------+------------------+------+-----+---------+-------+
  24. 2 rows in set (0.00 sec)

  25. mysql>
复制代码


其中的记录是:

  1. mysql> select * from tb_student;
  2. +----------+-------+
  3. | name     | score |
  4. +----------+-------+
  5. | zhangsan |   100 |
  6. | zhangsan |    90 |
  7. | lisi     |    80 |
  8. | lisi     |    70 |
  9. | lisi     |    30 |
  10. | lisi     |     0 |
  11. | lisi     |     0 |
  12. +----------+-------+
  13. 7 rows in set (0.00 sec)
复制代码


现在, 我们要对这个数据进行统计, 以name为维度, 看看每个人考试的次数,
此时需要用group by对人进行聚合组:

  1. mysql> select name, count(*) cnt from tb_student group by name;
  2. +----------+-----+
  3. | name     | cnt |
  4. +----------+-----+
  5. | lisi     |   5 |
  6. | zhangsan |   2 |
  7. +----------+-----+
  8. 2 rows in set (0.00 sec)
复制代码

可见lisi考了5次, zhangsan考了2次。
(小细节: cnt之前可以加上as, 不加也没关系)
还是以name为维度,看每个人考试的总分:

  1. mysql> select name, sum(score) sum from tb_student group by name;
  2. +----------+------+
  3. | name     | sum  |
  4. +----------+------+
  5. | lisi     |  180 |
  6. | zhangsan |  190 |
  7. +----------+------+
  8. 2 rows in set (0.00 sec)
  9. mysql
复制代码

可见, lisi总分是180分, zhangsan总分是190分。
上面两种情况, 如果要进行排序, 加上order by就能轻易搞定。

另外, 有时候需要针对某项进行去重, 则可以这么搞起:

  1. mysql> select name, count(distinct score) cnt from tb_student group by name;
  2. +----------+-----+
  3. | name     | cnt |
  4. +----------+-----+
  5. | lisi     |   4 |
  6. | zhangsan |   2 |
  7. +----------+-----+
  8. 2 rows in set (0.00 sec)
  9. mysql>
复制代码


好了, 不多说, 总之, group就是聚合分组。






您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.