近期主要在做公司网站的个人主页上用户相关数据的统计工作,需要频繁用到 MySQL 的 group by 的操作。顺便总结一下,温故而知新。
-
简述
“GROUP BY” 从字面意义上理解就是根据 “BY” 指定的规则(例如:一个或者多个列)对数据进行分组,所谓分组就是将一个“数据集”划分成若干个“小区域”,然后根据若干个“小区域”进行数据处理。
在分组的列上我们可以使用 COUNT, SUM, AVG 等聚合函数。 -
示例表
- 创建表
CREATE TABLE IF NOT EXISTS `test_group_by_syntax` ( `id` INT UNSIGNED AUTO_INCREMENT, `type` VARCHAR ( 45 ) NOT NULL, `num` INT ( 11 ) NOT NULL, `remark` VARCHAR ( 100 ) NULL, PRIMARY KEY ( `id` ) ) ENGINE = INNODB DEFAULT CHARSET = utf8;
- 插入测试数据
INSERT INTO test_group_by_syntax ( `type`, `num`, `remark` ) VALUES ( 'a', 5, 'a2002' ), ( 'a', 2, 'a2001' ), ( 'b', 10, 'b2003' ), ( 'b', 6, 'b2002' ), ( 'b', 3, 'b2001' ), ( 'c', 9, 'c2004' ), ( 'c', 9, 'c2005' ), ( 'c', 8, 'c2003' ), ( 'c', 7, 'c2002' ), ( 'c', 4, 'c2001' ), ( 'a', 11, 'a2001' ), ( 'b', 6, 'b2002' );
-
常规用法
-
示例1:统计每个类别数量总和
SELECT type AS '类名', sum( num ) AS 总数 FROM test_group_by_syntax GROUP BY type;
-
示例2:统计每个分类并排序
注意:GROUP BY 和 ORDER BY一起使用时,ORDER BY要在GROUP BY的后面
SELECT type AS '类别', sum( num ) FROM test_group_by_syntax GROUP BY type ORDER BY remark ASC;
-
示例3:多列分组统计
SELECT type AS '类别', remark AS '摘要', sum( num ) FROM test_group_by_syntax GROUP BY type, remark;
-
-
高级用法(GROUP BY 与聚合函数)
函数 作用 sum(列名) 求和 max(列名) 最大值 min(列名) 最小值 avg(列名) 平均值 count(列名) 统计记录数 注意和count(*)的区别 -
示例4:求各组平均值
SELECT type AS '类别', avg( num ) FROM test_group_by_syntax GROUP BY type;
-
示例5:求各组记录总数
SELECT type AS '类别', count( * ) FROM test_group_by_syntax GROUP BY type;
-
-
总结
GROUP BY 语句根据一个或多个列对结果集进行分组。在分组统计方面用的比较多,有时候也会配合者 select distinct 去重。
参考来源