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

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

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

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

一、场景与表结构设计

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

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

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

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

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

1. 创建用户表(user)

sql 复制代码
-- 创建用户表:存储用户基本信息
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)

sql 复制代码
-- 创建商品表:存储商品信息
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)

sql 复制代码
-- 创建订单表:存储订单交易信息(关联用户表和商品表)
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. 插入测试数据

sql 复制代码
-- 插入用户数据(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 月的 "已支付" 订单总金额,看两个月的销售表现。

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

sql 复制代码
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:分析各商品分类的销售情况(销量、销售额、占比)

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

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

sql 复制代码
-- 先统计各分类的销量和销售额,再用子查询计算占比
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。

sql 复制代码
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:分析不同地区用户的消费情况(客单价、订单数)

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

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

sql 复制代码
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 个消费用户

相关推荐
子兮曰4 小时前
🚀Vue3异步组件:90%开发者不知道的性能陷阱与2025最佳实践
前端·vue.js·vite
牛十二4 小时前
mac-intel操作系统go-stock项目(股票分析工具)安装与配置指南
开发语言·前端·javascript
我真的是大笨蛋4 小时前
K8S-Pod(上)
java·云原生·容器·kubernetes
whysqwhw4 小时前
Kuikly 扩展原生 API 的完整流程
前端
whysqwhw4 小时前
Hippy 跨平台框架扩展原生自定义组件
前端
OEC小胖胖4 小时前
页面间的导航:`<Link>` 组件和 `useRouter`
前端·前端框架·web·next.js
纪元A梦4 小时前
贪心算法应用:数字孪生同步问题详解
java·算法·贪心算法
Micrle_0075 小时前
java分布式场景怎么实现一个高效的 读-写锁
java·分布式