1.SQL 基础查询与分组聚合在电商数据分析中的应用
SQL基础查询与分组聚合在电商数据分析中具有核心价值。本文介绍了SQL在电商场景中的三大应用:数据提取、指标计算和异常筛选。内容涵盖基础查询语法、WHERE条件筛选、ORDER BY排序、LIMIT分页等实用技巧,重点讲解了GROUP BY分组聚合原理及电商GMV、订单量等关键指标的计算方法。文章还提供了MySQL安装指南和电商模拟数据准备步骤,并通过实际案例演示了店铺销售分析、用户购买行为统计等
SQL 基础查询与分组聚合在电商数据分析中的应用
第1章 SQL基础查询与分组聚合在电商数据分析中的实际价值
1.1 为什么电商数据分析师必须学SQL
SQL在电商数据分析里,核心就干三件事:
-
取数据:从千万级的订单表里,快速筛选出你要的某天、某店铺、某类目的数据
-
算指标:统计GMV、订单量、客单价、转化率这些核心运营指标
-
做筛选:找高价值用户、找出滞销商品、识别异常数据
学会基础查询和分组聚合,你能解决电商日常90%的数据提取需求。不用求人,不用等,自己动手几分钟出结果。
1.2 学习前的准备工作
1.2.1 数据库工具安装
我推荐新手用MySQL,免费、稳定、教程多。配套的图形化工具用MySQL Workbench,官方自带,够用。
步骤1:下载MySQL
-
打开浏览器,访问MySQL官网(https://dev.mysql.com/downloads/installer/)
-
选择“MySQL Installer for Windows”(根据你的操作系统选择)
-
点击下载,选择“No thanks, just start my download”
步骤2:安装MySQL
-
双击安装包,选择“Developer Default”安装类型
-
一路点击“Next”,到“Accounts and Roles”步骤时,设置root密码(一定要记住)
-
安装完成后,启动MySQL Workbench
步骤3:验证安装
-
打开MySQL Workbench
-
点击“Local instance MySQL”连接
-
输入root密码,成功进入说明安装完成
1.2.2 准备电商测试数据
为了实操,我们需要一张订单表。我准备了一份模拟的服饰类目订单数据,包含字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
| order_id | varchar(50) | 订单号 |
| user_id | varchar(50) | 用户ID |
| shop_name | varchar(50) | 店铺名称 |
| category | varchar(20) | 商品类目 |
| amount | decimal(10,2) | 订单金额 |
| order_status | varchar(10) | 订单状态(paid/finished/closed) |
| create_time | datetime | 下单时间 |
| 创建表并插入数据的SQL脚本,我会在综合实操案例中完整提供。 |
第2章 SQL基础查询核心认知与电商高频查询场景
2.1 电商数据分析师最常用的查询场景
回顾我每天的工作,基础查询主要用在三个场景:
场景一:查某个店铺某天的订单明细
运营问“昨天店铺A卖了什么”,需要快速拉出订单明细。
场景二:查某个用户的购买记录
客服需要查某个用户的历史订单,用于处理售后。
场景三:查异常数据
比如金额为0的订单、状态异常的订单,需要先定位再处理。
2.2 SELECT基础查询
2.2.1 语法与操作
SELECT 字段1, 字段2
FROM 表名;
步骤1:查询所有字段
SELECT * FROM orders;
这会返回orders表的所有列和所有行。但实际工作中,我们很少用*,因为可能包含不需要的字段,而且数据量大时影响性能。
步骤2:查询指定字段
SELECT order_id, user_id, amount, create_time
FROM orders;
电商场景实操:查看最近10条订单
SELECT order_id, user_id, amount, create_time
FROM orders
ORDER BY create_time DESC
LIMIT 10;
先排序后截取,就能看到最新订单。
2.3 WHERE条件筛选
2.3.1 基础条件筛选
SELECT 字段
FROM 表名
WHERE 条件;
电商场景实操:查询某个店铺的所有订单
SELECT order_id, user_id, amount, create_time
FROM orders
WHERE shop_name = '时尚女装旗舰店';
电商场景实操:查询金额大于500元的订单
SELECT order_id, user_id, amount, create_time
FROM orders
WHERE amount > 500;
电商场景实操:查询指定日期范围内的订单
SELECT order_id, user_id, amount, create_time
FROM orders
WHERE create_time >= '2025-11-01'
AND create_time < '2025-12-01';
2.3.2 多条件组合
用AND、OR、IN、LIKE等。
电商场景实操:查询已支付且金额大于1000的订单
SELECT order_id, user_id, amount
FROM orders
WHERE order_status = 'paid'
AND amount > 1000;
电商场景实操:查询多个店铺的订单
SELECT order_id, shop_name, amount
FROM orders
WHERE shop_name IN ('时尚女装旗舰店', '潮流男装专营店');
电商场景实操:查询用户ID以“vip”开头的订单
SELECT order_id, user_id, amount
FROM orders
WHERE user_id LIKE 'vip%';
我刚开始用LIKE时,总忘了加%。比如想找“vip”开头的,写了LIKE 'vip',结果一条都没查到。后来才明白,LIKE 'vip%'才是“vip开头”,LIKE '%vip'才是“vip结尾”,LIKE '%vip%'才是“包含vip”。这个细节卡了我好几次。
2.4 ORDER BY排序
2.4.1 单字段排序
SELECT order_id, amount, create_time
FROM orders
ORDER BY amount DESC; -- 降序
SELECT order_id, amount, create_time
FROM orders
ORDER BY create_time ASC; -- 升序,ASC可省略
2.4.2 多字段排序
先按金额降序,金额相同的按时间升序:
SELECT order_id, amount, create_time
FROM orders
ORDER BY amount DESC, create_time ASC;
电商场景实操:找出店铺销量最高的前5个商品(假设有商品表)
SELECT product_id, SUM(quantity) as total_sales
FROM order_details
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 5;
2.5 LIMIT限制返回行数
电商场景实操:分页查看订单
-- 第1页,每页20条
SELECT order_id, create_time, amount
FROM orders
ORDER BY create_time DESC
LIMIT 0, 20;
-- 第2页
SELECT order_id, create_time, amount
FROM orders
ORDER BY create_time DESC
LIMIT 20, 20;
2.6 电商数据合规提示
查询用户数据时的合规边界
在电商公司,用户订单数据属于敏感数据。查询时注意:
-
不要随意导出包含用户手机号、地址的完整明细到个人电脑
-
测试查询时,用
LIMIT限制返回条数,避免误导出大量数据 -
如果只需要统计数据,尽量用聚合查询,不返回明细
我在前公司见过一个同事,为了验证SQL结果,把整张用户表的手机号和地址都导到了Excel,然后随手发在了工作群里。被合规部发现后,受到了严重警告。
第3章 GROUP BY分组聚合核心原理
3.1 分组聚合在电商数据分析中的核心价值
如果基础查询是“捞数据”,分组聚合就是“算指标”。电商运营每天看的指标,几乎都是分组聚合算出来的:
-
GMV(成交总额)= 按天/按月/按店铺对订单金额求和
-
订单量 = 按天/按月/按类目对订单计数
-
客单价 = 总金额 / 总订单数
-
用户复购率 = 按用户分组,计算每个用户下单次数
3.2 GROUP BY语法与聚合函数
3.2.1 基础语法
SELECT 分组字段, 聚合函数(字段)
FROM 表名
WHERE 条件
GROUP BY 分组字段;
常用聚合函数:
-
SUM(字段):求和 -
COUNT(字段):计数 -
AVG(字段):平均值 -
MAX(字段):最大值 -
MIN(字段):最小值
3.2.2 电商场景实操:按店铺统计GMV和订单量
SELECT
shop_name,
SUM(amount) AS gmv,
COUNT(order_id) AS order_cnt
FROM orders
WHERE order_status IN ('paid', 'finished')
GROUP BY shop_name
ORDER BY gmv DESC;
分步操作:
-
从orders表筛选已支付和已完成的订单(排除未支付、已关闭)
-
按
shop_name分组 -
对每组内的
amount求和得到GMV,对订单号计数得到订单量 -
按GMV降序排列
预期结果:得到每个店铺的GMV和订单量,可以看到哪个店铺贡献最大。
3.2.3 电商场景实操:按天统计GMV趋势
SELECT
DATE(create_time) AS sale_date,
SUM(amount) AS gmv,
COUNT(order_id) AS order_cnt,
AVG(amount) AS avg_order_value
FROM orders
WHERE order_status IN ('paid', 'finished')
GROUP BY DATE(create_time)
ORDER BY sale_date;
分步操作:
-
DATE(create_time)将时间戳转为日期,用于按天分组 -
分组后计算每天的GMV、订单量、平均订单金额
-
按日期排序,得到趋势
3.2.4 电商场景实操:按类目统计销售额占比
SELECT
category,
SUM(amount) AS sales,
SUM(amount) / (SELECT SUM(amount) FROM orders WHERE order_status IN ('paid', 'finished')) * 100 AS sales_pct
FROM orders
WHERE order_status IN ('paid', 'finished')
GROUP BY category
ORDER BY sales DESC;
这里用到了子查询计算总GMV,然后用每个类目的销售额除以总GMV得到百分比。
3.3 分组聚合的常见错误与避坑
我的踩坑经历
我刚入行时,有一次做月度GMV统计。我用的是:
SELECT SUM(amount) FROM orders WHERE create_time BETWEEN '2025-10-01' AND '2025-10-31';
结果出来之后,运营拿着报表去跟老板汇报,说GMV比上月增长20%。但后来财务对账发现,实际GMV只增长了5%。我排查了很久,才发现问题:WHERE create_time BETWEEN '2025-10-01' AND '2025-10-31'没有排除已取消和退款的订单。那些订单虽然下单了,但最终没成交,不应该计入GMV。
从那以后,我每次做GMV统计,都会加上order_status条件:
WHERE order_status IN ('paid', 'finished')
分组聚合常见错误:
| 错误类型 | 错误写法 | 正确写法 |
|---|---|---|
| 忘记过滤无效订单 | SUM(amount) |
加WHERE order_status IN ('paid','finished') |
| 分组字段不在SELECT中 | SELECT amount, COUNT(*) ... GROUP BY shop_name |
分组字段必须在SELECT中 |
| 聚合函数里用分组字段 | SELECT shop_name, SUM(shop_name) |
聚合函数只能用于数值字段 |
使用WHERE筛选聚合结果 |
WHERE COUNT(*) > 10 |
用HAVING而不是WHERE |
第4章 HAVING分组后筛选语法
4.1 WHERE与HAVING的核心区别
很多新手分不清WHERE和HAVING:
-
WHERE:在分组前筛选原始数据行 -
HAVING:在分组后筛选聚合结果
示例:
SELECT category, SUM(amount) AS total_sales
FROM orders
WHERE order_status = 'paid' -- 先筛选已支付的订单
GROUP BY category
HAVING SUM(amount) > 10000 -- 再筛选销售额大于1万的类目
4.2 电商场景实操:筛选有效动销类目
业务需求:找出订单量超过100笔的商品类目,排除那些只有零星销售的类目。
SELECT
category,
COUNT(order_id) AS order_cnt,
SUM(amount) AS gmv
FROM orders
WHERE order_status IN ('paid', 'finished')
GROUP BY category
HAVING COUNT(order_id) >= 100
ORDER BY gmv DESC;
4.3 电商场景实操:筛选高价值用户(消费金额>5000)
SELECT
user_id,
COUNT(order_id) AS order_cnt,
SUM(amount) AS total_spent
FROM orders
WHERE order_status IN ('paid', 'finished')
GROUP BY user_id
HAVING SUM(amount) > 5000
ORDER BY total_spent DESC;
分步操作:
-
筛选有效订单
-
按用户分组,统计每个用户的订单数和总消费
-
用
HAVING筛选总消费大于5000的用户 -
得到高价值用户列表
4.4 实操避坑提醒
陷阱一:试图在HAVING中使用非聚合字段
-- 错误
SELECT category, SUM(amount)
FROM orders
GROUP BY category
HAVING category = '女装';
正确做法:把category条件放到WHERE里,因为它是分组前的筛选。
陷阱二:忘记HAVING必须跟聚合函数
HAVING后面的条件必须包含聚合函数(如SUM、COUNT),不能直接用字段名。
第5章 综合实操案例:抖音服饰类目月度店铺核心运营指标统计
5.1 案例背景
业务场景:抖音服饰类目店铺“时尚女装旗舰店”,需要统计2025年10月的核心运营指标,包括:
-
月度GMV、订单量、客单价
-
按商品类目拆分的GMV和订单量
-
按日统计的GMV趋势
-
高价值用户(月消费≥1000元)数量及贡献占比
涉及数据表:orders(订单表)
5.2 准备工作:创建测试数据
步骤1:创建数据库和表
CREATE DATABASE IF NOT EXISTS ecommerce;
USE ecommerce;
CREATE TABLE orders (
order_id VARCHAR(50) PRIMARY KEY,
user_id VARCHAR(50),
shop_name VARCHAR(50),
category VARCHAR(20),
amount DECIMAL(10,2),
order_status VARCHAR(10),
create_time DATETIME
);
步骤2:插入测试数据
这里提供一部分模拟数据(实际使用时可以自行生成更多):
INSERT INTO orders VALUES
('ORD001', 'u1001', '时尚女装旗舰店', '连衣裙', 299.00, 'paid', '2025-10-01 10:23:45'),
('ORD002', 'u1002', '时尚女装旗舰店', '上衣', 189.00, 'finished', '2025-10-01 14:15:20'),
('ORD003', 'u1003', '时尚女装旗舰店', '裤子', 259.00, 'paid', '2025-10-02 09:45:10'),
('ORD004', 'u1001', '时尚女装旗舰店', '连衣裙', 329.00, 'finished', '2025-10-03 16:20:33'),
('ORD005', 'u1004', '时尚女装旗舰店', '外套', 599.00, 'closed', '2025-10-03 11:05:22'),
('ORD006', 'u1005', '时尚女装旗舰店', '上衣', 129.00, 'paid', '2025-10-05 20:30:12'),
('ORD007', 'u1002', '时尚女装旗舰店', '裤子', 279.00, 'finished', '2025-10-07 12:10:05'),
('ORD008', 'u1006', '时尚女装旗舰店', '连衣裙', 399.00, 'paid', '2025-10-10 18:45:30'),
('ORD009', 'u1007', '时尚女装旗舰店', '外套', 899.00, 'finished', '2025-10-15 09:20:15'),
('ORD010', 'u1008', '时尚女装旗舰店', '上衣', 159.00, 'paid', '2025-10-20 15:35:40');
5.3 分步操作:计算核心指标
5.3.1 月度GMV、订单量、客单价
SELECT
SUM(amount) AS total_gmv,
COUNT(order_id) AS total_orders,
AVG(amount) AS avg_order_value
FROM orders
WHERE shop_name = '时尚女装旗舰店'
AND order_status IN ('paid', 'finished')
AND create_time >= '2025-10-01'
AND create_time < '2025-11-01';
预期结果:
| total_gmv | total_orders | avg_order_value |
|---|---|---|
| 2791.00 | 8 | 348.875 |
5.3.2 按类目拆分的GMV和订单量
SELECT
category,
SUM(amount) AS gmv,
COUNT(order_id) AS order_cnt
FROM orders
WHERE shop_name = '时尚女装旗舰店'
AND order_status IN ('paid', 'finished')
AND create_time >= '2025-10-01'
AND create_time < '2025-11-01'
GROUP BY category
ORDER BY gmv DESC;
预期结果:
| category | gmv | order_cnt |
|---|---|---|
| 连衣裙 | 1027.00 | 3 |
| 外套 | 899.00 | 1 |
| 上衣 | 477.00 | 3 |
| 裤子 | 538.00 | 2 |
5.3.3 按日统计GMV趋势
SELECT
DATE(create_time) AS sale_date,
SUM(amount) AS gmv,
COUNT(order_id) AS order_cnt
FROM orders
WHERE shop_name = '时尚女装旗舰店'
AND order_status IN ('paid', 'finished')
AND create_time >= '2025-10-01'
AND create_time < '2025-11-01'
GROUP BY DATE(create_time)
ORDER BY sale_date;
预期结果:每天一条记录,展示GMV和订单量的变化趋势。
5.3.4 高价值用户(月消费≥1000元)数量及贡献占比
步骤1:先找出高价值用户及其消费总额
SELECT
user_id,
SUM(amount) AS total_spent
FROM orders
WHERE shop_name = '时尚女装旗舰店'
AND order_status IN ('paid', 'finished')
AND create_time >= '2025-10-01'
AND create_time < '2025-11-01'
GROUP BY user_id
HAVING SUM(amount) >= 1000;
步骤2:计算高价值用户数量和贡献占比
WITH high_value_users AS (
SELECT
user_id,
SUM(amount) AS total_spent
FROM orders
WHERE shop_name = '时尚女装旗舰店'
AND order_status IN ('paid', 'finished')
AND create_time >= '2025-10-01'
AND create_time < '2025-11-01'
GROUP BY user_id
HAVING SUM(amount) >= 1000
)
SELECT
COUNT(DISTINCT hvu.user_id) AS high_value_user_cnt,
SUM(hvu.total_spent) AS high_value_gmv,
SUM(hvu.total_spent) / (SELECT SUM(amount) FROM orders
WHERE shop_name = '时尚女装旗舰店'
AND order_status IN ('paid', 'finished')
AND create_time >= '2025-10-01'
AND create_time < '2025-11-01') * 100 AS contribution_pct
FROM high_value_users hvu;
预期结果:本例中,用户u1001消费两次共628元,u1002消费两次共468元,都没有超过1000元,所以高价值用户数为0,贡献占比0%。如果数据量更大,就能看到实际结果。
5.4 结果验证与常见问题
执行完所有查询后,建议做交叉验证:
-
按类目GMV之和应该等于总GMV
-
按日GMV之和也应该等于总GMV
如果对不上,检查是否漏了WHERE条件,或者日期范围是否正确。
在统计高价值用户时,我们只用了user_id(脱敏后的用户标识)和消费金额,没有查询用户的手机号、地址等敏感信息。实际工作中,如果确实需要联系高价值用户,应该由运营或客服人员通过公司内部系统获取联系方式,不要通过SQL直接导出用户的完整个人信息。
第6章 本章踩坑清单与合规总结
6.1 新手常见踩坑
| 场景 | 错误操作 | 正确做法 |
|---|---|---|
| 统计GMV | 没过滤订单状态,把取消和退款也算进去了 | 加WHERE order_status IN ('paid','finished') |
| 分组聚合 | SELECT中写了字段,但GROUP BY漏了这个字段 |
确保所有非聚合字段都在GROUP BY中 |
| 筛选聚合结果 | 用WHERE加聚合条件 |
用HAVING |
| 日期范围 | BETWEEN包含下一天的部分数据 |
用>= start AND < end+1 |
| 排序 | 忘记ORDER BY,结果顺序随机 |
明确指定排序字段和方向 |
| 性能 | 在大表上SELECT * |
只选需要的字段,加LIMIT测试 |
6.2 电商数据合规红线
查询权限:生产数据库的查询权限应该按角色分配。数据分析师通常只有只读权限,不能修改数据。不要用root账号日常查询,应申请独立的只读账号。
敏感字段保护:订单表中的user_id、phone、address等字段,查询时如果不需要,就不要SELECT。需要脱敏展示时,用CONCAT(LEFT(phone,3), '****', RIGHT(phone,4))等方式处理。
查询留痕:重要数据的查询,尤其是涉及用户明细的,建议在查询工具中开启审计日志,或者通过公司规定的统一查询平台执行,不要私自在本地工具中直连生产库。
数据导出限制:从数据库导出数据到Excel时,先确认导出范围。非必要不导出完整明细,优先用聚合统计。导出的文件要加密存储,用完及时删除。
第7章 结语
SQL基础查询和分组聚合,是电商数据分析师每天都要用的核心技能。学完这一章,你应该能独立完成日常的订单统计、店铺报表、活动效果分析等任务。
有问题的评论区留言,我看到会回复。
更多推荐

所有评论(0)