MySQL 聚合函数案例解析:深入实践与应用
MySQL聚合函数是数据库查询中极为重要的工具,它们能够从一组行中计算出单个值,如总和、平均值、最大值等,广泛应用于数据分析、报表生成及业务洞察。本文通过一系列实战案例,深入解析COUNT()
、SUM()
、AVG()
、MAX()
、MIN()
、GROUP_CONCAT()
等常用聚合函数,以及如何结合GROUP BY
、HAVING
等子句,实现复杂的数据聚合任务。
一、案例背景
假设我们有一个销售数据表sales_data
,包含以下字段:
order_id
:订单IDproduct_name
:产品名称quantity
:销售数量price
:单价sale_date
:销售日期category
:产品类别
二、基本聚合函数应用
1. 统计总订单数
SELECT COUNT(order_id) AS total_orders
FROM sales_data;
2. 计算总销售额
SELECT SUM(quantity * price) AS total_sales
FROM sales_data;
3. 计算平均单价
SELECT AVG(price) AS average_price
FROM sales_data;
4. 查找最高单价商品
SELECT MAX(price) AS max_price
FROM sales_data;
5. 查找最低单价商品
SELECT MIN(price) AS min_price
FROM sales_data;
三、GROUP BY与聚合函数的结合
6. 按产品类别统计总销售额
SELECT category, SUM(quantity * price) AS category_sales
FROM sales_data
GROUP BY category;
7. 每月销售总额
SELECT DATE_FORMAT(sale_date, '%Y-%m') AS month, SUM(quantity * price) AS monthly_sales
FROM sales_data
GROUP BY month;
四、HAVING子句的使用
8. 查找销售额超过10000的类别
SELECT category, SUM(quantity * price) AS total_sales
FROM sales_data
GROUP BY category
HAVING total_sales > 10000;
五、GROUP_CONCAT()的高级应用
9. 汇总每个订单的商品列表
SELECT order_id, GROUP_CONCAT(product_name SEPARATOR ', ') AS products
FROM sales_data
GROUP BY order_id;
六、实战案例:分析特定时间段的销售情况
任务
分析2023年第一季度各月份的销售情况,包括:
- 各月销售的总订单数
- 各月的总销售额
- 平均每月的销售数量
- 销售额最高的产品类别
解决方案
-- 各月销售的总订单数
SELECT
DATE_FORMAT(sale_date, '%Y-%m') AS month,
COUNT(DISTINCT order_id) AS total_orders
FROM sales_data
WHERE sale_date BETWEEN '2023-01-01' AND '2023-03-31'
GROUP BY month;
-- 各月的总销售额
SELECT
DATE_FORMAT(sale_date, '%Y-%m') AS month,
SUM(quantity * price) AS total_sales
FROM sales_data
WHERE sale_date BETWEEN '2023-01-01' AND '2023-03-31'
GROUP BY month;
-- 平均每月的销售数量
SELECT
DATE_FORMAT(sale_date, '%Y-%m') AS month,
AVG(quantity) AS avg_quantity
FROM sales_data
WHERE sale_date BETWEEN '2023-01-01' AND '2023-03-31'
GROUP BY month;
-- 销售额最高的产品类别
SELECT
category,
SUM(quantity * price) AS total_sales
FROM sales_data
WHERE sale_date BETWEEN '2023-01-01' AND '2023-03-31'
GROUP BY category
ORDER BY total_sales DESC
LIMIT 1;