SQL聚合函数功能与用法详解

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(*) 统计所有行,包括NULL
  • COUNT(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;

四、重要注意事项

  1. NULL值处理

    • COUNT(*) 外,所有聚合函数都忽略NULL值
    • 使用 COALESCE() 处理NULL值:AVG(COALESCE(column, 0))
  2. 性能考虑

    • 在大数据表上使用聚合函数可能影响性能
    • 适当使用索引可以提高聚合查询效率
  3. 数据类型限制

    • SUM()AVG() 只能用于数值类型
    • MIN()MAX() 可用于多种数据类型
  4. DISTINCT关键字

    sql 复制代码
    -- 计算不同客户的数量
    SELECT COUNT(DISTINCT customer_id) FROM orders;
    
    -- 计算不同价格的平均值
    SELECT AVG(DISTINCT price) FROM products;
  5. 与窗口函数的区别

    • 聚合函数:返回单行结果
    • 窗口函数:保留多行原始数据,同时显示聚合结果
相关推荐
历程里程碑3 分钟前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
程序员泠零澪回家种桔子22 分钟前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
CodeCaptain30 分钟前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud
2601_9495936541 分钟前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
javachen__41 分钟前
mysql新老项目版本选择
数据库·mysql
Dxy12393102161 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light1 小时前
MySQL相关问题
数据库·mysql
Anastasiozzzz1 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人1 小时前
通过脚本推送Docker镜像
java·docker·容器
蜡笔小炘2 小时前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs