SQL聚合函数详解
一、什么是聚合函数
聚合函数是对一组值执行计算并返回单个值的函数,主要用于数据汇总和统计。它们通常与 GROUP BY 子句结合使用,对数据分组后进行汇总计算。
二、主要聚合函数
1. COUNT - 计数函数
sql
-- 统计总行数(包括NULL值)
SELECT COUNT(*) FROM orders;
-- 统计特定列非空值的数量
SELECT COUNT(customer_id) FROM orders;
-- 统计唯一值的数量
SELECT COUNT(DISTINCT product_id) FROM order_items;
特点:
COUNT(*)统计所有行,包括NULLCOUNT(column)只统计非NULL值- 可以结合
DISTINCT统计唯一值数量
2. SUM - 求和函数
sql
-- 计算销售总额
SELECT SUM(amount) FROM sales;
-- 计算每个客户的总消费
SELECT customer_id, SUM(order_total)
FROM orders
GROUP BY customer_id;
-- 结合条件筛选
SELECT SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END)
FROM transactions;
特点:
- 只能用于数值类型
- 忽略NULL值
- 常用于财务、统计计算
3. AVG - 平均值函数
sql
-- 计算平均销售额
SELECT AVG(sale_amount) FROM sales;
-- 计算每个部门的平均工资
SELECT department, AVG(salary)
FROM employees
GROUP BY department;
-- 保留两位小数
SELECT ROUND(AVG(price), 2) FROM products;
特点:
- 只计算数值类型
- 忽略NULL值
- 常与
ROUND()结合控制小数位数
4. MIN - 最小值函数
sql
-- 查找最低价格
SELECT MIN(price) FROM products;
-- 查找每个类别的最早创建日期
SELECT category, MIN(created_date)
FROM products
GROUP BY category;
-- 可用于非数值类型
SELECT MIN(product_name) FROM products; -- 按字母顺序
特点:
- 可用于数值、日期、字符串等类型
- 对于字符串,按字母顺序比较
- 忽略NULL值
5. MAX - 最大值函数
sql
-- 查找最高价格
SELECT MAX(price) FROM products;
-- 查找每个部门的最高薪资
SELECT department, MAX(salary)
FROM employees
GROUP BY department;
-- 查找最近订单日期
SELECT MAX(order_date) FROM orders;
特点:
- 可用于多种数据类型
- 与MIN相反,查找最大值
- 忽略NULL值
三、聚合函数使用示例
基本查询示例
sql
-- 综合使用多个聚合函数
SELECT
COUNT(*) as total_orders,
SUM(amount) as total_sales,
AVG(amount) as avg_sale,
MIN(amount) as min_sale,
MAX(amount) as max_sale
FROM orders
WHERE order_date >= '2024-01-01';
结合GROUP BY使用
sql
-- 按月份统计销售数据
SELECT
EXTRACT(MONTH FROM order_date) as month,
COUNT(*) as order_count,
SUM(amount) as monthly_sales,
AVG(amount) as avg_order_value
FROM orders
WHERE EXTRACT(YEAR FROM order_date) = 2024
GROUP BY EXTRACT(MONTH FROM order_date)
ORDER BY month;
结合HAVING子句
sql
-- 筛选出总销售额超过10000的客户
SELECT
customer_id,
COUNT(*) as order_count,
SUM(amount) as total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 10000;
四、重要注意事项
-
NULL值处理:
- 除
COUNT(*)外,所有聚合函数都忽略NULL值 - 使用
COALESCE()处理NULL值:AVG(COALESCE(column, 0))
- 除
-
性能考虑:
- 在大数据表上使用聚合函数可能影响性能
- 适当使用索引可以提高聚合查询效率
-
数据类型限制:
SUM()和AVG()只能用于数值类型MIN()和MAX()可用于多种数据类型
-
DISTINCT关键字:
sql-- 计算不同客户的数量 SELECT COUNT(DISTINCT customer_id) FROM orders; -- 计算不同价格的平均值 SELECT AVG(DISTINCT price) FROM products; -
与窗口函数的区别:
- 聚合函数:返回单行结果
- 窗口函数:保留多行原始数据,同时显示聚合结果