1. 理解GROUP BY与HAVING的本质区别
在PostgreSQL中,GROUP BY和HAVING这两个子句经常被同时使用,但它们解决的问题完全不同。让我用一个实际场景来解释:假设你是一家电商平台的数据分析师,现在需要统计每个商品类别的销售总额,并且只关注销售额超过10万元的类别。
这里就涉及到两个操作:
- 按商品类别分组并计算每组的销售总额(GROUP BY的职责)
- 从分组结果中筛选出符合条件的分组(HAVING的职责)
1.1 GROUP BY的工作原理
GROUP BY的核心是对数据进行分组聚合。当执行包含GROUP BY的查询时,PostgreSQL会:
- 根据GROUP BY指定的列对数据进行分组
- 为每个分组计算聚合函数(如COUNT、SUM、AVG等)
- 返回每个分组的单行结果
sql复制-- 基本语法
SELECT 分组列, 聚合函数(列)
FROM 表
GROUP BY 分组列;
例如,统计每个部门的员工数量:
sql复制SELECT department_id, COUNT(*) as employee_count
FROM employees
GROUP BY department_id;
1.2 HAVING的过滤机制
HAVING子句在GROUP BY之后执行,它的作用是过滤分组结果。与WHERE不同,WHERE在分组前过滤单行数据,而HAVING过滤的是整个分组。
sql复制-- 完整语法
SELECT 分组列, 聚合函数(列)
FROM 表
GROUP BY 分组列
HAVING 聚合函数条件;
继续电商的例子,要找出销售额超过10万的商品类别:
sql复制SELECT category, SUM(sales) as total_sales
FROM products
GROUP BY category
HAVING SUM(sales) > 100000;
关键区别:WHERE在数据分组前过滤,HAVING在分组后过滤。WHERE不能使用聚合函数,HAVING必须使用聚合函数或分组列。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 典型应用场景与实战案例
2.1 电商数据分析
假设有一个订单表orders(order_id
