SQL 实战指南:电商订单数据分析(订单 / 用户 / 商品表关联 + 统计需求)

发布于:2025-09-07 ⋅ 阅读:(23) ⋅ 点赞:(0)

在电商运营中,“分析订单销售情况” 是核心需求 —— 比如 “统计每月销售额”“找出销量最高的商品”“分析不同地区用户的消费习惯” 等。这些需求都需要关联 “用户表”“商品表”“订单表” 三表数据,再通过 SQL 统计实现。今天我们从零搭建电商核心数据表,完整实现 6 个高频订单分析需求,代码可直接复制运行,帮你掌握电商数据分析的实战逻辑。

我整理了一份学习资料合集,包含考试、专业、课程等资料,还有游戏和软件合集。

学习资料合集文档https://www.kdocs.cn/l/cjchDXwklk1B

一、场景与表结构设计

电商订单分析的核心是 “人 - 货 - 单” 的关联:

  • 用户表(user):记录用户基本信息(谁买的);
  • 商品表(product):记录商品信息(买了什么);
  • 订单表(order):记录订单交易信息(什么时候买、买了多少、花了多少钱)。

三表关联逻辑:通过 “用户 ID” 关联用户表和订单表,通过 “商品 ID” 关联商品表和订单表,形成完整的 “交易链路”。

二、第一步:创建数据表并插入测试数据

先创建三表并插入模拟数据(涵盖不同用户、商品、订单状态),为后续分析做准备。

1. 创建用户表(user)

-- 创建用户表:存储用户基本信息
CREATE TABLE `user` (
    user_id INT PRIMARY KEY AUTO_INCREMENT,  -- 用户ID(自增主键)
    user_name VARCHAR(20) NOT NULL,  -- 用户名
    user_phone CHAR(11) NOT NULL,  -- 用户手机号
    user_region VARCHAR(30) NOT NULL,  -- 用户所在地区(如北京、上海)
    register_time DATE NOT NULL  -- 用户注册时间
);

2. 创建商品表(product)

-- 创建商品表:存储商品信息
CREATE TABLE product (
    product_id INT PRIMARY KEY AUTO_INCREMENT,  -- 商品ID(自增主键)
    product_name VARCHAR(50) NOT NULL,  -- 商品名称
    product_category VARCHAR(20) NOT NULL,  -- 商品分类(如手机、家电、服装)
    product_price DECIMAL(10,2) NOT NULL,  -- 商品单价
    product_stock INT NOT NULL  -- 商品库存
);

3. 创建订单表(order)

-- 创建订单表:存储订单交易信息(关联用户表和商品表)
CREATE TABLE `order` (
    order_id INT PRIMARY KEY AUTO_INCREMENT,  -- 订单ID(自增主键)
    user_id INT NOT NULL,  -- 关联用户表的用户ID
    product_id INT NOT NULL,  -- 关联商品表的商品ID
    order_quantity INT NOT NULL,  -- 购买数量
    order_amount DECIMAL(10,2) NOT NULL,  -- 订单金额(数量×单价)
    order_time DATETIME NOT NULL,  -- 下单时间
    order_status VARCHAR(10) NOT NULL,  -- 订单状态(已支付、待支付、已取消)
    -- 外键约束:确保订单的用户ID在用户表中存在
    FOREIGN KEY (user_id) REFERENCES `user`(user_id),
    -- 外键约束:确保订单的商品ID在商品表中存在
    FOREIGN KEY (product_id) REFERENCES product(product_id)
);

4. 插入测试数据

-- 插入用户数据(5个用户,覆盖不同地区)
INSERT INTO `user` (user_name, user_phone, user_region, register_time)
VALUES
('张三', '13812345678', '北京', '2025-01-10'),
('李四', '13987654321', '上海', '2025-02-15'),
('王五', '13711112222', '广州', '2025-03-20'),
('赵六', '13633334444', '深圳', '2025-04-25'),
('孙七', '13555556666', '北京', '2025-05-30');

-- 插入商品数据(6个商品,覆盖不同分类)
INSERT INTO product (product_name, product_category, product_price, product_stock)
VALUES
('iPhone 15', '手机', 5999.00, 100),
('华为Mate 60', '手机', 4999.00, 80),
('小米空气净化器', '家电', 899.00, 50),
('美的电饭煲', '家电', 399.00, 120),
('优衣库纯棉T恤', '服装', 99.00, 200),
('耐克运动鞋', '服装', 599.00, 60);

-- 插入订单数据(12条订单,覆盖不同状态、时间、用户)
INSERT INTO `order` (user_id, product_id, order_quantity, order_amount, order_time, order_status)
VALUES
-- 张三的订单(北京用户)
(1, 1, 1, 5999.00, '2025-06-01 10:30:00', '已支付'),
(1, 3, 1, 899.00, '2025-06-15 14:20:00', '已支付'),
-- 李四的订单(上海用户)
(2, 2, 1, 4999.00, '2025-06-02 09:15:00', '已支付'),
(2, 5, 2, 198.00, '2025-07-05 11:40:00', '已支付'),
-- 王五的订单(广州用户)
(3, 4, 1, 399.00, '2025-06-03 16:50:00', '待支付'),
(3, 6, 1, 599.00, '2025-07-10 15:30:00', '已支付'),
-- 赵六的订单(深圳用户)
(4, 1, 1, 5999.00, '2025-06-05 08:45:00', '已取消'),
(4, 3, 2, 1798.00, '2025-07-12 13:10:00', '已支付'),
-- 孙七的订单(北京用户)
(5, 2, 1, 4999.00, '2025-06-08 12:20:00', '已支付'),
(5, 5, 3, 297.00, '2025-07-15 10:00:00', '已支付'),
(5, 6, 1, 599.00, '2025-08-01 09:30:00', '待支付'),
(5, 4, 1, 399.00, '2025-08-05 16:20:00', '已支付');

-- 验证数据:查看三表关联的基础信息
SELECT 
    o.order_id,
    u.user_name,
    u.user_region,
    p.product_name,
    p.product_category,
    o.order_quantity,
    o.order_amount,
    o.order_status
FROM `order` o
JOIN `user` u ON o.user_id = u.user_id
JOIN product p ON o.product_id = p.product_id
LIMIT 5;

基础关联结果示例:

order_id

user_name

user_region

product_name

product_category

order_quantity

order_amount

order_status

1

张三

北京

iPhone 15

手机

1

5999.00

已支付

2

张三

北京

小米空气净化器

家电

1

899.00

已支付

3

李四

上海

华为 Mate 60

手机

1

4999.00

已支付

4

李四

上海

优衣库纯棉 T 恤

服装

2

198.00

已支付

5

王五

广州

美的电饭煲

家电

1

399.00

待支付

三、第二步:高频订单分析需求实现(6 个核心场景)

基于三表数据,实现电商运营中最常见的 6 个分析需求,每个需求包含 “需求描述→SQL 代码→结果说明”。

需求 1:统计 2025 年 6-7 月各月的总销售额(按月份分组)

需求描述:计算 2025 年 6 月和 7 月的 “已支付” 订单总金额,看两个月的销售表现。

核心逻辑:筛选 “已支付” 订单 + 按 “下单月份” 分组 + 聚合订单金额。

SELECT 
    DATE_FORMAT(order_time, '%Y-%m') AS 月份,  -- 提取下单时间的“年-月”
    SUM(order_amount) AS 月总销售额,  -- 聚合每月总销售额
    COUNT(DISTINCT order_id) AS 月订单数  -- 统计每月订单数量(去重,避免重复订单)
FROM `order`
WHERE 
    order_status = '已支付'  -- 只统计已支付订单
    AND order_time BETWEEN '2025-06-01 00:00:00' AND '2025-07-31 23:59:59'  -- 时间范围:6-7月
GROUP BY DATE_FORMAT(order_time, '%Y-%m')  -- 按月份分组
ORDER BY 月份 ASC;  -- 按月份升序排列

运行结果

月份

月总销售额

月订单数

2025-06

17295.00

4

2025-07

7891.00

4

结果解读:6 月总销售额 17295 元,7 月 7891 元,6 月销售额是 7 月的 2.2 倍,可能 6 月有促销活动(如 618),7 月回归常态。

需求 2:分析各商品分类的销售情况(销量、销售额、占比)

需求描述:统计 “手机”“家电”“服装” 三大分类的总销量、总销售额,以及销售额占比,找出核心品类。

核心逻辑:三表关联(订单表→商品表)+ 按 “商品分类” 分组 + 计算占比。

-- 先统计各分类的销量和销售额,再用子查询计算占比
SELECT 
    p.product_category AS 商品分类,
    SUM(o.order_quantity) AS 总销量,  -- 分类总销量
    SUM(o.order_amount) AS 总销售额,  -- 分类总销售额
    -- 计算销售额占比:(分类销售额/总销售额)×100,保留2位小数
    ROUND(
        SUM(o.order_amount) / (SELECT SUM(order_amount) FROM `order` WHERE order_status = '已支付') * 100, 
        2
    ) AS 销售额占比(%)
FROM `order` o
JOIN product p ON o.product_id = p.product_id
WHERE o.order_status = '已支付'  -- 只统计已支付订单
GROUP BY p.product_category  -- 按商品分类分组
ORDER BY 总销售额 DESC;  -- 按总销售额降序,突出核心品类

运行结果

商品分类

总销量

总销售额

销售额占比 (%)

手机

3

15997.00

69.32

家电

4

3995.00

17.23

服装

7

3191.00

13.45

结果解读:手机品类是核心品类,销售额占比近 70%,总销售额 15997 元;家电和服装占比相对较低,可针对性优化服装品类的推广策略。

需求 3:找出销量最高的前 3 个商品(按销量排序)

需求描述:统计所有 “已支付” 订单中,每个商品的总销量,找出销量 TOP3 的商品。

核心逻辑:三表关联 + 按 “商品 ID / 名称” 分组 + 按销量降序 + LIMIT 限制前 3。

SELECT 
    p.product_id AS 商品ID,
    p.product_name AS 商品名称,
    p.product_category AS 商品分类,
    SUM(o.order_quantity) AS 总销量,  -- 商品总销量
    SUM(o.order_amount) AS 总销售额  -- 商品总销售额
FROM `order` o
JOIN product p ON o.product_id = p.product_id
WHERE o.order_status = '已支付'
GROUP BY p.product_id, p.product_name, p.product_category  -- 按商品唯一标识分组
ORDER BY 总销量 DESC  -- 按销量降序
LIMIT 3;  -- 取前3名

运行结果

商品 ID

商品名称

商品分类

总销量

总销售额

5

优衣库纯棉 T 恤

服装

5

495.00

3

小米空气净化器

家电

3

2697.00

1

iPhone 15

手机

1

5999.00

结果解读:优衣库纯棉 T 恤销量最高(5 件),但因单价低,总销售额不高;iPhone 15 虽销量仅 1 件,但单价高,销售额最高,符合 “高单价低销量” 的特点。

需求 4:分析不同地区用户的消费情况(客单价、订单数)

需求描述:统计各地区用户的 “已支付” 订单数、总消费金额、客单价(总金额 / 订单数),了解地区消费能力。

核心逻辑:三表关联(订单表→用户表)+ 按 “地区” 分组 + 计算客单价。

SELECT 
    u.user_region AS 用户地区,
    COUNT(DISTINCT o.order_id) AS 订单数,  -- 地区订单数(去重)
    COUNT(DISTINCT u.user_id) AS 用户数,  -- 地区消费用户数(去重)
    SUM(o.order_amount) AS 总消费金额,  -- 地区总消费
    -- 客单价:总消费金额/订单数,保留2位小数(客单价=平均每笔订单消费金额)
    ROUND(SUM(o.order_amount) / COUNT(DISTINCT o.order_id), 2) AS 客单价
FROM `order` o
JOIN `user` u ON o.user_id = u.user_id
WHERE o.order_status = '已支付'
GROUP BY u.user_region  -- 按地区分组
ORDER BY 总消费金额 DESC;

运行结果

用户地区

订单数

用户数

总消费金额

客单价

北京

5

2

12193.00

2438.60

上海

2

1

5197.00

2598.50

深圳

1

1

1798.00

1798.00

广州

1

1

599.00

599.00

结果解读:北京地区总消费最高(12193 元),且有 2 个消费用户