介绍
在本实验中,我们将探索 MySQL 中的数据聚合和分组操作,这些是分析和汇总数据库中数据的关键技能。你将学习如何使用聚合函数对多行数据进行计算,基于列值对数据进行分组,并过滤分组后的结果。这些技术对于生成报告、分析趋势以及从数据中提取有意义的见解至关重要。通过动手练习,你将获得这些关键数据库操作的实践经验,并理解如何在 MySQL 中有效地分析数据。
在本实验中,我们将探索 MySQL 中的数据聚合和分组操作,这些是分析和汇总数据库中数据的关键技能。你将学习如何使用聚合函数对多行数据进行计算,基于列值对数据进行分组,并过滤分组后的结果。这些技术对于生成报告、分析趋势以及从数据中提取有意义的见解至关重要。通过动手练习,你将获得这些关键数据库操作的实践经验,并理解如何在 MySQL 中有效地分析数据。
在这一步中,我们将探索 MySQL 中的基本聚合函数。这些函数对多行数据进行计算并返回单个值,是数据分析中不可或缺的工具。
首先,让我们连接到 MySQL 并选择数据库:
sudo mysql -u root
连接成功后:
USE sales_db;
让我们从 COUNT 函数开始,它用于计算结果集中的行数:
-- 计算总销售数量
SELECT COUNT(*) as total_sales
FROM sales;
你应该会看到类似以下的输出:
+--------------+
| total_sales |
+--------------+
| 12 |
+--------------+
COUNT 可以以不同的方式使用:
-- 计算销售的唯一产品数量
SELECT COUNT(DISTINCT product_name) as unique_products
FROM sales;
-- 按类别计算销售数量
SELECT category, COUNT(*) as sales_count
FROM sales
GROUP BY category;
说明:
COUNT(*)
计算表中的所有行,包括 NULL 值COUNT(DISTINCT column)
仅计算指定列中的唯一值as
关键字为结果列创建别名,使输出更易读SUM 函数用于计算数值列的总和:
-- 计算总销售数量
SELECT SUM(quantity) as total_items_sold
FROM sales;
-- 计算总收入
SELECT
ROUND(SUM(quantity * unit_price), 2) as total_revenue
FROM sales;
说明:
quantity * unit_price
这样的计算会在聚合之前执行AVG 函数用于计算平均值:
-- 计算平均单价
SELECT
ROUND(AVG(unit_price), 2) as avg_price
FROM sales;
-- 计算每次销售的平均数量
SELECT
ROUND(AVG(quantity), 1) as avg_quantity
FROM sales;
说明:
这些函数用于查找最大值和最小值:
-- 查找产品的价格范围
SELECT
MIN(unit_price) as lowest_price,
MAX(unit_price) as highest_price
FROM sales;
-- 查找第一次和最后一次销售的日期
SELECT
MIN(sale_date) as first_sale,
MAX(sale_date) as last_sale
FROM sales;
说明:
在这一步中,我们将学习如何使用 GROUP BY 子句对数据进行分组。分组允许我们基于特定列值对数据的子集执行聚合计算。
让我们从简单的分组操作开始:
-- 按类别统计销售数量和总数量
SELECT
category,
COUNT(*) as sales_count,
SUM(quantity) as total_quantity
FROM sales
GROUP BY category
ORDER BY total_quantity DESC;
此查询显示每个类别的销售数量和总销售数量。你应该会看到类似以下的输出:
+-------------+-------------+----------------+
| category | sales_count | total_quantity |
+-------------+-------------+----------------+
| Furniture | 5 | 22 |
| Electronics | 5 | 21 |
| Appliances | 2 | 10 |
+-------------+-------------+----------------+
说明:
我们可以通过多列分组来获得更详细的洞察:
-- 按类别和地区进行销售分析
SELECT
category,
region,
COUNT(*) as sales_count,
SUM(quantity) as total_quantity,
ROUND(SUM(quantity * unit_price), 2) as total_revenue
FROM sales
GROUP BY category, region
ORDER BY category, total_revenue DESC;
说明:
MySQL 提供了提取日期部分的函数,可用于基于时间的分组:
-- 每日销售摘要
SELECT
sale_date,
COUNT(*) as transactions,
SUM(quantity) as items_sold,
ROUND(SUM(quantity * unit_price), 2) as daily_revenue
FROM sales
GROUP BY sale_date
ORDER BY sale_date;
说明:
在这一步中,我们将学习 HAVING 子句,它允许我们在分组后对结果进行过滤。WHERE 在分组前过滤单行数据,而 HAVING 则过滤分组本身。
让我们查找总销售数量超过 15 件的类别:
SELECT
category,
SUM(quantity) as total_quantity
FROM sales
GROUP BY category
HAVING total_quantity > 15;
这将仅显示总数量超过 15 件的类别:
+-------------+----------------+
| category | total_quantity |
+-------------+----------------+
| Electronics | 21 |
| Furniture | 22 |
+-------------+----------------+
说明:
我们可以同时使用 WHERE 和 HAVING。WHERE 在分组前过滤行,而 HAVING 在分组后过滤:
-- 查找北部地区的高销量类别
SELECT
category,
COUNT(*) as sale_count,
SUM(quantity) as total_quantity
FROM sales
WHERE region = 'North'
GROUP BY category
HAVING total_quantity > 5;
说明:
我们可以在 HAVING 中使用多个条件:
-- 查找高销量和高收入的类别
SELECT
category,
COUNT(*) as sale_count,
SUM(quantity) as total_quantity,
ROUND(SUM(quantity * unit_price), 2) as total_revenue
FROM sales
GROUP BY category
HAVING total_quantity > 10 AND total_revenue > 1000
ORDER BY total_revenue DESC;
说明:
在这最后一步中,我们将结合之前学到的所有内容,探索更高级的聚合技术。我们将创建全面的销售报告,展示这些工具的强大功能。
让我们创建一个全面的销售分析:
SELECT
category,
COUNT(DISTINCT product_name) as unique_products,
COUNT(*) as total_transactions,
SUM(quantity) as total_quantity,
ROUND(AVG(quantity), 1) as avg_quantity_per_sale,
ROUND(MIN(unit_price), 2) as min_price,
ROUND(MAX(unit_price), 2) as max_price,
ROUND(SUM(quantity * unit_price), 2) as total_revenue
FROM sales
GROUP BY category
ORDER BY total_revenue DESC;
说明:
让我们按地区分析销售绩效:
SELECT
region,
COUNT(DISTINCT category) as categories_sold,
COUNT(DISTINCT product_name) as unique_products,
SUM(quantity) as total_quantity,
ROUND(SUM(quantity * unit_price), 2) as total_revenue,
ROUND(SUM(quantity * unit_price) / SUM(quantity), 2) as avg_price_per_unit
FROM sales
GROUP BY region
HAVING total_revenue > 1000
ORDER BY total_revenue DESC;
说明:
让我们创建一个每日销售趋势报告:
SELECT
sale_date,
COUNT(DISTINCT category) as categories_sold,
COUNT(DISTINCT product_name) as unique_products,
COUNT(*) as transactions,
SUM(quantity) as total_quantity,
ROUND(SUM(quantity * unit_price), 2) as daily_revenue,
ROUND(AVG(quantity * unit_price), 2) as avg_transaction_value
FROM sales
GROUP BY sale_date
ORDER BY sale_date;
说明:
在本实验中,我们涵盖了 MySQL 中数据聚合和分组的基本内容:
这些技能是 MySQL 中数据分析和报告的基础。掌握如何有效地聚合和分组数据,可以帮助你从数据库中提取有意义的见解,并创建有价值的业务报告。