SQL中如何使用聚合函数_SQL聚合函数的用法详解

SQL中如何使用聚合函数_SQL聚合函数的用法详解
最新回答
爱哭的小鬼

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;。

二、聚合函数与GROUP BY的协同
  • 核心逻辑:先按指定列分组,再对每组数据应用聚合函数。

    示例:统计每个客户的总消费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);

五、总结
  • 基础场景:直接使用聚合函数(如SUM、COUNT)快速计算总和或行数。
  • 分组分析:结合GROUP BY和HAVING实现按组统计和过滤。
  • 高级需求:利用条件聚合、窗口函数或多维度聚合函数(ROLLUP/CUBE)提升分析灵活性。
  • 性能关键:合理使用索引、避免嵌套聚合,并优先在WHERE中过滤数据。

掌握这些用法后,可高效处理从简单统计到复杂数据分析的各类SQL任务。