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. 与窗口函数的区别

    • 聚合函数:返回单行结果
    • 窗口函数:保留多行原始数据,同时显示聚合结果
相关推荐
2301_7806698618 小时前
文件字节流输出、文件复制、关闭流的方法
java
剑锋所指,所向披靡!19 小时前
C++之类模版
java·jvm·c++
逍遥德19 小时前
PostgreSQL 中唯一约束(UNIQUE CONSTRAINT) 和唯一索引(UNIQUE INDEX) 的核心区别
数据库·sql·postgresql·dba
工业甲酰苯胺19 小时前
字符串分割并展开成表格的SQL实现方法
数据库·sql
Coder_Boy_19 小时前
基于SpringAI的在线考试系统-0到1全流程研发:DDD、TDD与CICD协同实践
java·人工智能·spring boot·架构·ddd·tdd
sheji341619 小时前
【开题答辩全过程】以 面向高校校园的物物交换系统设计与实现为例,包含答辩的问题和答案
java·eclipse
科技块儿19 小时前
IP定位技术:游戏反外挂体系中的精准识别引擎
数据库·tcp/ip·游戏
衫水19 小时前
[特殊字符] MySQL 常用指令大全
数据库·mysql·oracle
卓怡学长20 小时前
m115乐购游戏商城系统
java·前端·数据库·spring boot·spring·游戏
2501_9445264220 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 蜘蛛纸牌游戏实现
android·java·python·flutter·游戏