在日常数据分析中,我们经常需要统计“分组数据占总量的比例”(比如统计不同性别用户的人数占比、不同订单状态的订单数占比)。MySQL中常用「子查询」和「窗口函数」实现这一需求,下面详细介绍两种方法的代码、优劣势及适用场景。
1、总量采用子查询
select sex,count() 人数, count()/(select count(*) from 表名) 占比 from 表名 group by sex;
优势:
• 兼容性强:支持所有MySQL版本(包括5.x等旧版本),无需担心环境适配问题;
• 逻辑直观:通过子查询单独计算总人数,新手容易理解和上手。
劣势:
• 性能一般:子查询会被执行多次(分组数越多,重复计算越多),数据量大时效率较低;
• 扩展性弱:若需要同时计算多个维度的占比,需写多个子查询,语句会更冗长。
2、总量采用窗口函数
select sex,count() 人数,sum(count()) over() 总人数, count()/sum(count()) over() 占比 from 表名 group by sex;
优势:
• 性能更高:窗口函数over()只需计算一次总人数,数据量大时效率明显优于子查询;
• 扩展性强:可通过over(partition by 其他字段)快速扩展到多维度占比统计,语句更简洁。
劣势:
• 版本限制:仅支持MySQL 8.0及以上版本,旧环境无法使用;
• 新手门槛:窗口函数的逻辑相对抽象,刚接触的开发者需要理解分组后再聚合的执行顺序。
tips:
1、若你的数据库是MySQL 5.x版本,或团队里新手较多 → 选「子查询」;
若数据库是MySQL 8.0+且数据量较大,或需要多维度统计 → 选「窗口函数」;
2、思考:占比通常显示为四位小数点,如何改成可读性更强的百分比格式呢? ————————————————