分组查询:GROUP BY与HAVING
引言 在上一篇我们学习了聚合函数(COUNT、SUM、AVG、MAX、MIN),它们能对整个结果集进行统计。但在实际开发中,我们经常需要分组统计: 统计每个类别的商品数量和平均价格 分析每个用户的订单总额和订单数 计算每个月的销售额和订单量 按地区统计客户数量和消费金额 这些需求都需要通过 GROUP BY 来实现——先分组,再对每组数据进行聚合计算。 为什么GROUP BY如此重要? 多维度分析:从不同角度分析数据(按时间、地区、类别等) 报表统计的核心:几乎所有报表都需要分组统计 业务洞察:发现不同群体的差异和规律 决策支持:为精细化运营提供数据依据 本文将系统讲解GROUP BY的原理、语法、使用技巧,以及HAVING子句的应用。 一、GROUP BY 基础 1.1 什么是分组查询? 分组查询将数据按照某个或某些列的值进行分组,然后对每个组分别进行聚合计算。 执行流程: FROM:确定要查询的表 WHERE:过滤行(在分组之前) GROUP BY:将数据分组 HAVING:过滤分组(在分组之后) SELECT:选择要返回的列和聚合结果 ORDER BY:对结果排序 LIMIT:限制返回行数 1.2 基本语法 SELECT column1, aggregate_function(column2) FROM table_name WHERE condition GROUP BY column1 HAVING group_condition ORDER BY column1; 1.3 准备测试数据 继续使用上一篇的订单表,并补充一些数据: -- 补充更多测试数据 INSERT INTO orders (user_id, product_name, price, quantity, order_date, status) VALUES (1, '小米13', 3299.00, 1, '2024-11-11', 'completed'), (2, 'iPad Air', 4799.00, 1, '2024-11-12', 'completed'), (3, 'AirPods Pro', 1999.00, 1, '2024-11-13', 'completed'), (4, '华为Mate 60', 6999.00, 1, '2024-11-14', 'completed'), (5, '小米14', 3999.00, 1, '2024-11-15', 'pending'), (6, 'MacBook Pro', 14999.00, 1, '2024-11-16', 'completed'), (7, 'iPhone 15 Pro', 7999.00, 1, '2024-11-17', 'cancelled'); 二、单字段分组 2.1 基础分组统计 -- 统计每个用户的订单数量 SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id; 结果: ...