mysql聚合函数,灵活组合可满足复杂的统计需求

首页 2025-09-20 10:37:40


MySQL 聚合函数用于对一组数据进行计算并返回单一结果,常用于 GROUP BY 子句配合统计分析场景。以下是常用的聚合函数及用法:

1. COUNT():统计记录数

  • 功能:返回查询结果的行数。
  • 语法:
    sql
    COUNT(expr)  -- 统计expr非NULL值的数量
    COUNT(*)     -- 统计所有记录(包括NULL)
    COUNT(1)     -- 同COUNT(*),效率相近
    
     
     
  • 示例:
    sql
    -- 统计用户表总人数
    SELECT COUNT(*) AS total_users FROM users;
    
    -- 统计有邮箱的用户数(排除NULL)
    SELECT COUNT(email) AS users_with_email FROM users;
    
     
     

2. SUM():求和

  • 功能:计算数值列的总和(忽略 NULL)。
  • 语法:SUM(column)
  • 示例:
    sql
    -- 计算所有订单的总金额
    SELECT SUM(amount) AS total_amount FROM orders;
    
    -- 计算某用户的订单总金额
    SELECT SUM(amount) AS user_total FROM orders WHERE user_id = 100;
    
     
     

3. AVG():求平均值

  • 功能:计算数值列的平均值(忽略 NULL)。
  • 语法:AVG(column)
  • 示例:
    sql
    -- 计算产品的平均价格
    SELECT AVG(price) AS avg_price FROM products;
    
    -- 计算某类别产品的平均评分
    SELECT AVG(rating) AS avg_rating FROM products WHERE category = 'books';
    
     
     

4. MAX():求最大值

  • 功能:返回列中的最大值(适用于数值、字符串、日期等类型)。
  • 语法:MAX(column)
  • 示例:
    sql
    -- 查找最高的产品价格
    SELECT MAX(price) AS max_price FROM products;
    
    -- 查找最新的订单日期
    SELECT MAX(order_date) AS latest_order FROM orders;
    
     
     

5. MIN():求最小值

  • 功能:返回列中的最小值(与MAX()类似,支持多类型)。
  • 语法:MIN(column)
  • 示例:
    sql
    -- 查找最低的产品价格
    SELECT MIN(price) AS min_price FROM products;
    
    -- 查找最早的注册日期
    SELECT MIN(register_date) AS earliest_reg FROM users;
    
     
     

6. GROUP_CONCAT():合并字符串

  • 功能:将分组中的字符串连接成一个字符串(需配合GROUP BY使用)。
  • 语法:GROUP_CONCAT([DISTINCT] column [SEPARATOR '分隔符'])
  • 示例:
    sql
    -- 按类别分组,合并产品名称(用逗号分隔)
    SELECT 
      category,
      GROUP_CONCAT(product_name SEPARATOR ', ') AS products
    FROM products
    GROUP BY category;
    
    -- 去重并合并用户标签
    SELECT 
      user_id,
      GROUP_CONCAT(DISTINCT tag) AS tags
    FROM user_tags
    GROUP BY user_id;
    
     
     

7. 配合 GROUP BY 使用

聚合函数常与 GROUP BY 结合,实现分组统计:
sql
-- 按用户分组,统计每个用户的订单数和总消费
SELECT 
  user_id,
  COUNT(order_id) AS order_count,  -- 订单数
  SUM(amount) AS total_spent       -- 总消费
FROM orders
GROUP BY user_id;  -- 按user_id分组
 

8. HAVING 筛选聚合结果

WHERE 不能直接筛选聚合函数的结果,需用 HAVING
sql
-- 筛选订单数超过5的用户
SELECT 
  user_id,
  COUNT(order_id) AS order_count
FROM orders
GROUP BY user_id
HAVING order_count > 5;  -- 对聚合结果筛选
 

注意事项:

  • 聚合函数会自动忽略 NULL 值(COUNT(*) 除外)。
  • 若需对 NULL 视为 0 参与计算,可结合 IFNULL(),例如 SUM(IFNULL(score, 0))
  • DISTINCT 可用于去重计算,如 COUNT(DISTINCT user_id) 统计不同用户的数量。
这些函数是数据分析和报表生成的基础,灵活组合可满足复杂的统计需求。
nat123映射怎么用?超详细步骤,外网访问内网轻松搞定
nat123域名怎么用?两种方式轻松搞定
nat123怎么用?简单几步实现内网穿透
内网穿透工具对比:nat123、花生壳与轻量新选择
远程访问内网很简单:用对工具,一“箭”穿透
ngrok下载完全指南:从入门到获取客户端
内网远程桌面软件:穿透局域网边界的数字窗口
从外网远程访问内网服务器的完整方案
Windows Server 2008端口转发完全教程:netsh命令添加/查看/删除/重置
为什么三层交换机转发比Linux服务器快?转发表硬件加速的秘密