2022-06-17 20:49:07
SQL聚合函数用于对数据集进行汇总计算,将多行数据浓缩成一行概括性结果,常与GROUP BY、HAVING等子句协同工作,实现复杂的数据分析需求。 以下是详细用法及关键要点:
一、基础聚合函数COUNT()
COUNT(*):统计所有行,包括NULL值。
COUNT(column_name):仅统计指定列中非NULL值的行数。
示例:统计订单总数 SELECT COUNT(*) FROM orders;。
SUM(column_name)计算指定列中所有数值的总和,忽略NULL值。示例:计算订单总金额 SELECT SUM(order_total) FROM orders;。
AVG(column_name)计算指定列中所有数值的平均值,忽略NULL值。示例:计算产品平均价格 SELECT AVG(price) FROM products;。
MIN/MAX(column_name)分别返回指定列的最小值和最大值,忽略NULL值。示例:查找最高单价 SELECT MAX(price) FROM products;。
核心逻辑:先按指定列分组,再对每组数据应用聚合函数。
示例:统计每个客户的总消费SELECT customer_id, SUM(order_total) AS total_spentFROM ordersGROUP BY customer_id;
无GROUP BY时:聚合函数默认将整个表视为一个大组。示例:计算所有订单总金额 SELECT SUM(order_total) FROM orders;。
HAVING子句:用于过滤分组后的结果(与WHERE区分)。
示例:筛选总消费超过1000的客户SELECT customer_id, SUM(order_total) AS total_spentFROM ordersGROUP BY customer_idHAVING SUM(order_total) > 1000;
NULL值处理
聚合函数(如SUM、AVG)自动忽略NULL值,但COUNT(*)会统计所有行。
示例:统计有工资的员工数SELECT COUNT(*) AS total_employees, COUNT(salary) AS employees_with_salaryFROM employees;
DISTINCT与聚合函数
COUNT(DISTINCT column_name)统计唯一值数量,但性能开销较大。
优化建议:为常用DISTINCT的列创建索引。
GROUP BY性能
无索引时,GROUP BY可能导致全表扫描和排序。
优化建议:为GROUP BY列添加索引。
WHERE与HAVING的混淆
WHERE在分组前过滤行,HAVING在分组后过滤组。
示例:优先用WHERE减少分组数据量SELECT department_id, AVG(salary)FROM employeesWHERE hire_date > '2020-01-01'GROUP BY department_id;
避免嵌套聚合
直接嵌套聚合函数(如AVG(SUM(column)))通常不允许,需通过子查询或CTE实现。
条件聚合(Conditional Aggregation)结合CASE表达式实现多维度统计。
示例:统计男女平均工资SELECT AVG(CASE WHEN gender = 'Male' THEN salary END) AS avg_male_salary, AVG(CASE WHEN gender = 'Female' THEN salary END) AS avg_female_salaryFROM employees;
窗口函数(Window Functions)保留原始行细节的同时计算聚合值。
示例:计算部门平均工资并保留员工信息SELECT employee_id, department_id, salary, AVG(salary) OVER (PARTITION BY department_id) AS avg_department_salaryFROM employees;
多维度聚合报表使用ROLLUP、CUBE或GROUPING SETS生成多级汇总。
示例:使用ROLLUP统计产品类别和子类别的销售额SELECT product_category, product_subcategory, SUM(sales_amount) AS total_salesFROM salesGROUP BY ROLLUP (product_category, product_subcategory);
掌握这些用法后,可高效处理从简单统计到复杂数据分析的各类SQL任务。