一天到晚摆弄SQL的我们,要么是做电商的小伙伴,要么是电商的打工人……我们日常是不是总被各种数据查询、业务统计搞得头大?商品库存怎么实时更新?订单状态怎么清晰展示给用户?高价值客户该怎么精准筛选?为此,我在这里整理了71条电商高频SQL语句模板,从商品上架、订单处理到用户分析、营销活动,甚至库存调拨、售后退款,每个场景都有对应的SQL语句。每条语句都结合实际场景说明用法,我们跟着修改参数就能直接套用。不管是我们开发同学搭建功能模块,还是我们运营同学做数据复盘,这份“电商SQL语句模板”都能帮我们省去从零编写SQL的时间,从基础的库存余量查询,到复杂的用户复购率分析,再到促销活动的效果追踪,她覆盖电商日常90%以上的数据需求。
一、商品与类目管理
1、商品基础操作
(1)查询商品列表(带分页)
SELECT product_id, -- 商品唯一标识 product_name, -- 商品名称(前端展示用) price, -- 当前售价 stock_quantity, -- 实时库存数量 category_id -- 所属分类IDFROM products -- 商品主表WHERE category_id = 101 -- 筛选指定分类(如:"电子产品"分类ID=101) AND is_active = 1 -- 仅查询激活状态(未下架)的商品ORDER BY create_time DESC -- 按创建时间倒序,确保最新商品在前LIMIT 0, 20; -- 分页逻辑:从第0条开始取20条(对应前端第1页)注释:电商商品列表页核心查询,通过WHERE条件过滤无效商品,ORDER BY控制展示顺序,LIMIT实现分页加载,减轻数据库压力。
(2)新增商品
INSERT INTO products ( product_name, price, original_price, -- 原价(用于显示折扣力度,如:"原价399,现价299") stock_quantity, -- 初始库存 category_id, -- 所属分类 is_active, -- 状态:1=激活(上架),0=未激活(下架) create_time -- 创建时间) VALUES ('2024新款无线耳机', -- 商品名称需清晰描述特性 299.99, -- 售价(保留两位小数,符合金额规范) 399.99, -- 原价(高于售价,突出折扣) 500, -- 初始库存500件 101, -- 归类到"电子产品" 1, -- 直接上架 NOW() -- 自动记录当前时间);注释:商品上架时的基础信息录入,original_price用于营销展示,NOW()确保创建时间准确,便于后续库存和销售追踪。
(3)批量更新商品库存
UPDATE products SET stock_quantity = stock_quantity - 5, -- 库存减少5个(动态计算,避免硬编码) update_time = NOW() -- 更新时间戳,记录库存变动时间WHERE product_id IN (1001, 1002, 1003); -- 批量操作多个商品(如:同一订单中的多件商品)注释:订单确认后扣减库存的核心语句,stock_quantity - 5的写法确保即使库存被并发修改,也能基于最新值计算,减少超卖风险。
(4)查询商品分类及下属商品数
SELECT c.category_id, -- 分类ID c.category_name, -- 分类名称(如:"手机"、"电脑") COUNT(p.product_id) AS product_count -- 下属商品数量(别名便于前端调用)FROM categories c -- 分类表(别名c简化代码)LEFT JOIN products p -- 商品表(别名p) ON c.category_id = p.category_id -- 关联条件:分类ID匹配WHERE c.parent_id = 0 -- 仅查询一级分类(parent_id=0表示顶级分类)GROUP BY c.category_id, c.category_name; -- 按分类分组统计注释:通过LEFT JOIN关联分类与商品表,确保即使分类下无商品也会被列出(product_count为0),GROUP BY+COUNT()统计商品数量,用在分类导航页展示。
2、商品分析
(5)查询商品类目销售TOP3(按金额)
-- 按类目分组,取销售额前三的类目SELECT c.category_id, -- 类目ID c.category_name, -- 类目名称(如:"手机"、"家电") SUM(o.order_amount) AS total_sales -- 类目总销售额FROM orders o-- 关联商品表(获取商品所属类目)JOIN products p ON o.product_id = p.product_id-- 关联类目表(获取类目名称)JOIN categories c ON p.category_id = c.category_idWHERE o.order_status = 'paid' -- 仅统计有效订单GROUP BY c.category_id, c.category_name -- 按类目分组ORDER BY total_sales DESC -- 按销售额降序LIMIT 3; -- 取前三名场景:识别核心热销类目,我们便可针对性加大推广资源(如:首页置顶、活动倾斜),同时确保库存充足,避免热销类目缺货。
(6)分析商品库存预警(低于阈值的商品)
-- 筛选库存低于预警阈值的商品(如:低于10件)SELECT product_id, product_name, stock_quantity, -- 当前库存 stock_warning_threshold -- 预警阈值(可从配置表获取或硬编码)FROM productsWHERE stock_quantity <= stock_warning_threshold -- 库存不足 AND is_active = 1 -- 仅关注上架商品ORDER BY stock_quantity ASC; -- 按库存升序(最紧缺的商品在前)场景:供应链补货提醒,库存低于阈值的商品需优先补货,避免因缺货导致的订单流失,尤其适用于热销商品。
(7)查询商品的平均评分及评价数量
-- 计算每个商品的用户平均评分和总评价数SELECT p.product_id, p.product_name, AVG(r.rating) AS avg_rating, -- 平均评分(1-5分) COUNT(r.review_id) AS review_count -- 评价数量FROM products p-- 左连接:包含无评价商品LEFT JOIN reviews r ON p.product_id = r.product_idGROUP BY p.product_id, p.product_nameORDER BY avg_rating DESC, review_count DESC; -- 按评分和评价数降序场景:商品详情页展示评分,帮助用户决策;同时为我们运营提供商品质量反馈,低评分商品需排查原因(如:质量、描述不符)并优化。
(8)分析购物车商品转化率(加入购物车后最终购买的比例)
-- 计算购物车商品被购买的比例SELECT p.product_id, p.product_name, COUNT(DISTINCT c.cart_id) AS cart_count, -- 加入购物车次数 COUNT(DISTINCT o.order_id) AS buy_count, -- 最终购买次数 -- 转化率=购买次数/加购次数(保留2位小数) ROUND(COUNT(DISTINCT o.order_id)/COUNT(DISTINCT c.cart_id)*100, 2) AS cart_conversionFROM cart_items c -- 购物车表-- 左连接:关联同一用户购买该商品的订单LEFT JOIN orders o ON c.product_id = o.product_id AND c.user_id = o.user_id AND o.order_time >= c.add_time -- 订单时间晚于加购时间 AND o.order_status = 'paid' -- 有效订单-- 关联商品表获取名称JOIN products p ON c.product_id = p.product_idGROUP BY p.product_id, p.product_nameHAVING cart_count > 0 -- 排除无加购记录的商品ORDER BY cart_conversion DESC; -- 按转化率降序场景:识别高加购但低转化商品,可能存在价格过高、评价差等问题,我们可通过降价、优化详情页等方式提升转化率。
二、订单与交易管理
1、订单基础操作
(9)新增订单主表记录
INSERT INTO orders ( order_id, -- 订单唯一编号(自定义规则,如:"ORD+日期+序号") user_id, -- 下单用户ID total_amount, -- 订单总金额(商品原价总和) pay_amount, -- 实付金额(扣除优惠、运费后的金额) order_status, -- 订单状态(0=待支付,1=已支付等) create_time, -- 下单时间 pay_time -- 支付时间(未支付时为NULL)) VALUES ( CONCAT('ORD', DATE_FORMAT(NOW(), '%Y%m%d'), '001'), -- 生成带日期的订单号(如:"ORD20240520001") 88888, -- 用户ID(关联用户表) 599.98, -- 总金额(如:两件商品299.99*2) 549.98, -- 实付金额(减去50元优惠券) 0, -- 初始状态为待支付 NOW(), -- 下单时间 NULL -- 未支付,支付时间暂为空);注释:CONCAT()和DATE_FORMAT()生成规则化订单号,便于我们人工识别和系统管理;pay_amount需精确计算优惠后金额,pay_time待支付后更新。
(10)新增订单详情(子订单)
INSERT INTO order_items ( order_id, -- 关联的订单ID(与主表orders.order_id一致) product_id, -- 商品ID product_name, -- 冗余存储商品名称(防止商品改名后订单显示异常) unit_price, -- 购买时的单价(快照,不随商品调价变动) quantity, -- 购买数量 subtotal -- 小计(单价*数量,用在校验总金额)) VALUES ('ORD20240520001', 1001, '无线耳机', 299.99, 2, 599.98); -- 一条订单可包含多个商品(多行VALUES)注释:订单详情表需冗余存储商品购买时的关键信息(名称、单价),避免商品信息后续修改导致订单记录不一致,subtotal用于与主表total_amount校验,确保数据准确。
(11)更改订单状态(支付成功)
UPDATE orders SET order_status = 1, -- 更新状态为"已支付"(1=已支付) pay_time = NOW(), -- 记录支付时间 update_time = NOW() -- 记录状态更新时间WHERE order_id = 'ORD20240520001' -- 按订单号定位 AND order_status = 0; -- 仅允许从"待支付"状态更新(防重复支付或状态错乱)注释:更新条件包含原状态(order_status=0),是防止并发问题的关键(如:用户多次点击支付按钮),确保状态流转的原子性。
(12)查询用户的所有订单(带状态)
SELECT o.order_id, o.create_time, -- 下单时间 o.total_amount, -- 总金额 o.pay_amount, -- 实付金额 o.order_status, -- 状态码 -- 用CASE转换状态码为文字描述(前端直接展示,无需二次处理) CASE o.order_status WHEN 0 THEN '待支付' WHEN 1 THEN '已支付' WHEN 2 THEN '已发货' ELSE '已取消' END AS status_text FROM orders o WHERE o.user_id = 88888 -- 查询指定用户的订单ORDER BY o.create_time DESC; -- 最新订单在前注释:CASE函数将数字状态码转换为用户易懂的文字(如:“待支付”),减少前端逻辑处理,ORDER BY确保订单按时间倒序展示,符合用户习惯。
(13)查询订单详情(含商品信息)
SELECT oi.order_id, -- 订单号 oi.product_id, -- 商品ID oi.product_name, -- 商品名称(快照) oi.unit_price, -- 购买时单价 oi.quantity, -- 数量 oi.subtotal, -- 小计 o.order_status -- 订单整体状态(关联主表)FROM order_items oi -- 订单详情表JOIN orders o ON oi.order_id = o.order_id -- 关联订单主表WHERE oi.order_id = 'ORD20240520001'; -- 按订单号查询注释:通过JOIN一次性获取订单的商品明细和整体状态,避免前端多次查询,提升性能。
2、交易分析
(14)统计不同支付方式的订单占比
-- 计算每种支付方式的订单数占总订单数的比例SELECT payment_method, -- 支付方式(如:"微信支付"、"支付宝") COUNT(order_id) AS order_count, -- 该方式订单数 -- 占比=该方式订单数/总订单数(保留2位小数) ROUND(COUNT(order_id)/(SELECT COUNT(*) FROM orders WHERE order_status = 'paid')*100, 2) AS proportionFROM ordersWHERE order_status = 'paid' -- 仅统计有效订单GROUP BY payment_methodORDER BY proportion DESC; -- 按占比降序场景:了解用户偏好的支付方式,确保主流支付渠道稳定(如:高峰期扩容),同时可针对低占比支付方式推出优惠(如:“支付宝支付立减5元”)。
(15)查询未支付订单(超时未支付)
-- 筛选状态为“未支付”且超过30分钟未支付的订单(自动取消前提醒)SELECT order_id, user_id, order_time, -- 下单时间 -- 计算未支付分钟数 TIMESTAMPDIFF(MINUTE, order_time, NOW()) AS unpaid_minutesFROM ordersWHERE order_status = 'unpaid' -- 状态为未支付 AND TIMESTAMPDIFF(MINUTE, order_time, NOW()) > 30 -- 超过30分钟ORDER BY unpaid_minutes DESC; -- 按未支付时长降序场景:触发催付机制(如:短信、APP推送),提醒用户及时支付;若超过更长时间(如:24小时),可自动取消订单释放库存和优惠券。
(16)统计各地区订单量(按省份)
-- 按用户收货省份分组,统计订单数量SELECT ua.province, -- 用户收货省份 COUNT(o.order_id) AS order_count -- 该地区订单数FROM orders o-- 关联收货地址表JOIN user_addresses ua ON o.address_id = ua.address_idWHERE o.order_status = 'paid' -- 仅统计有效订单GROUP BY ua.provinceORDER BY order_count DESC; -- 按订单数降序场景:分析订单地域分布,在订单密集地区优化仓库布局(如:增设区域仓),缩短配送时间;在订单稀疏地区可考虑合并配送或调整运费策略。
(17)统计每月退货率(退货订单数/总订单数)
-- 按月份计算退货率SELECT DATE_FORMAT(order_time, '%Y-%m') AS month, -- 月份 -- 退货订单数(状态为"已退货") COUNT(DISTINCT CASE WHEN order_status = 'refunded' THEN order_id END) AS refund_order_count, COUNT(DISTINCT order_id) AS total_order_count, -- 总订单数 -- 退货率=退货订单数/总订单数(避免除以0,用NULLIF处理) ROUND(COUNT(DISTINCT CASE WHEN order_status = 'refunded' THEN order_id END) / NULLIF(COUNT(DISTINCT order_id), 0)*100, 2) AS refund_rateFROM ordersGROUP BY monthORDER BY month;场景:监控退货趋势,若某月份退货率突增,需排查原因(如:商品质量下降、物流问题);高退货率商品需优化或下架。
3、购物车操作
(18)查询用户购物车商品
SELECT c.cart_id, -- 购物车项ID c.product_id, -- 商品ID p.product_name, -- 商品名称 p.price, -- 商品当前售价(实时更新) c.quantity, -- 购物车中数量 p.stock_quantity, -- 实时库存(判断是否可购买) p.main_image -- 商品主图(前端展示)FROM cart_items c -- 购物车表JOIN products p ON c.product_id = p.product_id -- 关联商品表WHERE c.user_id = 88888 -- 当前用户 AND c.is_selected = 1; -- 选中的商品(结算用)注释:购物车列表核心查询,关联商品表获取实时价格和库存(避免用户看到的价格/库存与实际不符),is_selected筛选用户勾选的商品,用在结算页展示。
(19)更新购物车商品数量
UPDATE cart_items SET quantity = 3, -- 更新为3件(用户调整后的数量) update_time = NOW() -- 记录更新时间WHERE cart_id = 5001 -- 购物车项ID AND user_id = 88888; -- 确保是当前用户的购物车(防越权)注释:用户调整购物车商品数量时使用,user_id条件是权限控制的关键,防止恶意修改他人购物车;数量更新后需同步校验库存(前端或后端),避免超过库存上限。
(20)清空用户购物车(选中商品)
DELETE FROM cart_items WHERE user_id = 88888 AND is_selected = 1; -- 仅删除选中的商品(结算后清空)注释:订单提交后清空已结算的购物车商品,保留未选中的商品(用户可能后续继续购买),提升用户体验。
三、用户与会员管理
1、用户基础操作
(21)新增用户
INSERT INTO users ( user_id, username, -- 用户名 phone, -- 手机号(作为登录账号) password_hash, -- 密码哈希(不可逆加密) register_time -- 注册时间) VALUES ( 88888, 'zhang-san', -- 用户名(可自定义)'138****8000', -- 手机号(唯一,用于登录和验证) SHA2('user123456', 256), -- 用SHA2加密密码(比MD5更安全) NOW() -- 自动记录注册时间);注释:密码必须加密存储(SHA2、MD5+盐值等),禁止明文存储,phone需设置唯一索引,防止重复注册。
(22)用户登录验证
SELECT user_id, username FROM users WHERE phone = '138****8000' -- 用户输入的手机号 AND password_hash = SHA2('user123456', 256); -- 输入密码加密后与数据库比对注释:登录时将用户输入的密码加密后与数据库中的哈希值比对,验证通过则返回用户信息,避免密码在传输或验证过程中泄露。
(23)更新用户收货地址
UPDATE user_addresses SET receiver = '李四', -- 收货人姓名 phone = '13900139000', -- 联系电话 province = '广东省', city = '深圳市', detail_address = '南山区科技园XX路', -- 详细地址 is_default = 1 -- 设为默认地址(1=默认,0=非默认)WHERE address_id = 555 -- 地址ID(唯一标识) AND user_id = 88888; -- 确保是当前用户的地址(防止越权修改)注释:更新条件必须包含user_id,是权限控制的关键,防止用户通过地址ID修改他人地址,is_default用于标记默认地址,下单时自动选中。
(24)查询用户的默认收货地址
SELECT receiver, -- 收货人 phone, -- 电话 province, -- 省份 city, -- 城市 detail_address -- 详细地址FROM user_addresses WHERE user_id = 88888 AND is_default = 1; -- 只查询默认地址注释:下单流程中自动加载用户的默认地址,简化用户操作,提升下单效率。
(25)统计用户消费总额(用户画像)
SELECT u.user_id, u.username, -- COALESCE处理NULL为0(未消费用户的总额为0) COALESCE(SUM(o.pay_amount), 0) AS total_spent -- 总消费金额FROM users u -- 用户表LEFT JOIN orders o ON u.user_id = o.user_id AND o.order_status IN (1, 2, 3) -- 仅统计已支付/已完成的有效订单GROUP BY u.user_id, u.username; -- 按用户分组注释:LEFT JOIN确保所有用户都被统计(包括未消费用户),COALESCE将NULL转换为0,避免统计结果异常,用在用户价值评估。
2、用户行为分析
(26)分析用户复购率(按月份)
-- 统计每月用户复购率:复购用户数/总购买用户数SELECT DATE_FORMAT(order_time, '%Y-%m') AS month, -- 按年月分组(如:"2024-05") -- 复购用户数(购买次数≥2的用户) COUNT(DISTINCT CASE WHEN buy_count >= 2 THEN user_id END) / -- 总购买用户数 COUNT(DISTINCT user_id) AS repurchase_rate FROM ( -- 子查询:统计用户每月购买次数 SELECT user_id, DATE_FORMAT(order_time, '%Y-%m') AS month, COUNT(order_id) AS buy_count -- 每月购买次数 FROM orders WHERE order_status = 'paid' -- 仅统计有效订单 GROUP BY user_id, DATE_FORMAT(order_time, '%Y-%m')) AS user_monthly_ordersGROUP BY monthORDER BY month;场景:复购率是衡量用户忠诚度的核心指标,复购率越高说明用户对平台或商品的认可度越高,我们可针对低复购月份优化运营策略(如:推出复购券)。
(27)查询用户首次购买的商品信息
-- 找出每个用户首次下单购买的商品WITH user_first_order AS ( -- 子查询:获取用户首次下单时间 SELECT user_id, MIN(order_time) AS first_order_time -- 首次下单时间(最早的订单时间) FROM orders WHERE order_status = 'paid' GROUP BY user_id)SELECT u.user_id, u.first_order_time, -- 首次下单时间 o.order_id, -- 首次订单ID p.product_name, -- 首次购买的商品名称 o.order_amount -- 首次订单金额FROM user_first_order u-- 关联首次订单详情JOIN orders o ON u.user_id = o.user_id AND u.first_order_time = o.order_time-- 关联商品表获取名称JOIN products p ON o.product_id = p.product_id;场景:分析新用户首次购买偏好(如:品类、价格带),我们可针对性优化新用户福利(如:首次购买赠券、推荐同类商品),提升新用户留存。
(28)计算用户平均客单价(按会员等级)
-- 按会员等级分组,统计用户平均每次下单的金额SELECT m.member_level, -- 会员等级(如:"普通"、"白银"、"黄金") AVG(o.order_amount) AS avg_order_value -- 平均客单价FROM orders o-- 关联用户表JOIN users u ON o.user_id = u.user_id-- 关联会员等级表JOIN members m ON u.member_id = m.member_idWHERE o.order_status = 'paid' -- 仅统计有效订单GROUP BY m.member_levelORDER BY avg_order_value DESC; -- 按客单价降序场景:分析会员等级与消费能力的关系,若高等级会员客单价未显著高于低等级,我们需优化会员权益(如:专属折扣、积分翻倍),激励高等级会员消费。
(29)查询用户最近30天的消费总额
-- 统计每个用户近30天的总消费金额SELECT user_id, SUM(order_amount) AS total_consumption -- 总消费FROM ordersWHERE order_time >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) -- 近30天 AND order_status = 'paid' -- 仅统计已支付订单GROUP BY user_idORDER BY total_consumption DESC; -- 按消费额降序(高消费用户在前)场景:识别近期高价值用户,我们可定向推送专属优惠(如:“消费满额赠礼”)或邀请参与VIP活动,提升用户粘性。
(30)分析用户购买间隔(上次购买到本次购买的平均天数)
-- 计算用户两次购买之间的平均间隔天数WITH user_order_rn AS ( -- 子查询:给用户的订单按时间排序(生成序号) SELECT user_id, order_time, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_time) AS rn -- 订单序号(1=首次,2=第二次...) FROM orders WHERE order_status = 'paid' -- 仅统计有效订单)SELECT user_id, -- 计算平均间隔天数(当前订单时间-上一次订单时间) AVG(DATEDIFF(curr.order_time, prev.order_time)) AS avg_interval_daysFROM user_order_rn curr-- 关联上一次订单(序号=当前序号-1)JOIN user_order_rn prev ON curr.user_id = prev.user_id AND curr.rn = prev.rn + 1GROUP BY user_idHAVING COUNT(*) >= 2; -- 仅统计购买2次以上的用户场景:购买间隔反映用户消费周期,间隔短的用户可推送高频需求商品,间隔长的用户可在间隔期内发送唤醒优惠(如:“好久不见,专属8折券”)。
(31)统计用户访问商品详情页次数(PV)
SELECT target_id AS product_id, -- 商品ID(行为表中target_id存储商品ID) p.product_name, -- 商品名称 COUNT(*) AS view_count -- 访问次数(PV)FROM user_behavior -- 用户行为表(记录浏览、点击等行为)JOIN products p ON user_behavior.target_id = p.product_id -- 关联商品表WHERE behavior_type = 'view_detail' -- 行为类型:查看详情 AND behavior_time BETWEEN '2024-05-01' AND '2024-05-31' -- 限定5月GROUP BY target_id, p.product_nameORDER BY view_count DESCLIMIT 10; -- 取访问量前10的商品注释:通过用户行为日志分析商品关注度,访问量高但销量低的商品可能存在转化问题(如:价格、评价),可优化详情页或调整营销策略。
(32)分析用户加购未下单商品(流失预警)
-- 加购后7天内未下单的商品SELECT c.product_id, p.product_name, COUNT(DISTINCT c.user_id) AS user_count -- 加购未下单的用户数FROM cart_items c -- 购物车表-- 左连接:关联加购后7天内的订单LEFT JOIN orders o ON c.user_id = o.user_id AND c.product_id = o.product_id AND o.create_time BETWEEN c.update_time AND DATE_ADD(c.update_time, INTERVAL 7 DAY)JOIN products p ON c.product_id = p.product_id -- 关联商品表WHERE o.order_id IS NULL -- 无对应订单(未下单) AND c.update_time >= DATE_SUB(NOW(), INTERVAL 30 DAY) -- 近30天加购GROUP BY c.product_id, p.product_nameORDER BY user_count DESC; -- 按未下单用户数降序注释:识别高加购但低转化的商品,我们可针对性推出优惠券(如:“该商品立减20元”)或发送库存预警(如:“仅剩5件”),刺激用户下单。
(33)查询用户最近浏览的10件商品
SELECT target_id AS product_id, -- 商品ID p.product_name, -- 商品名称 p.price, -- 当前价格 behavior_time AS view_time -- 浏览时间FROM user_behavior -- 用户行为表JOIN products p ON target_id = p.product_id -- 关联商品表WHERE user_id = 88888 -- 当前用户 AND behavior_type = 'view_detail' -- 行为类型:查看详情ORDER BY behavior_time DESC -- 按浏览时间倒序(最新的在前)LIMIT 10; -- 取最近10件注释:用于“最近浏览”功能,帮助用户快速找到之前关注的商品,提升复访率和转化率,尤其适用于用户未加购但有兴趣的商品。
四、营销与活动管理
1、优惠工具操作
(34)新增优惠券
INSERT INTO coupons ( coupon_id, -- 优惠券ID coupon_name, -- 优惠券名称(如:"满200减50") discount_type, -- 优惠类型(1=满减,2=折扣) discount_value, -- 优惠值(满减50元则为50,9折则为90) min_spend, -- 最低消费门槛(满200减50则为200) start_time, -- 有效期开始时间 end_time -- 有效期结束时间) VALUES ('CP202405', '夏季大促满200减50', -- 名称需清晰说明优惠规则 1, -- 满减类型 50, -- 减50元 200, -- 满200可用'2024-05-01 00:00:00', -- 开始时间'2024-05-31 23:59:59' -- 结束时间(精确到秒));注释:discount_type区分优惠类型,min_spend控制使用门槛,start_time和end_time限制有效期,确保优惠券规则明确。
(35)用户领取优惠券
INSERT INTO user_coupons ( user_id, -- 领取用户ID coupon_id, -- 优惠券ID get_time, -- 领取时间 is_used, -- 是否使用(0=未使用,1=已使用) use_time -- 使用时间(未使用则为NULL)) VALUES ( 88888, 'CP202405', -- 优惠券ID NOW(), -- 领取时间 0, -- 未使用 NULL -- 未使用,使用时间为空);注释:记录用户领取的优惠券,is_used和use_time用于跟踪使用状态,避免重复使用。
(36)查询用户可用优惠券(未过期、未使用)
SELECT c.coupon_id, c.coupon_name, -- 优惠券名称 c.discount_type, -- 优惠类型 c.discount_value, -- 优惠值 c.min_spend, -- 门槛 c.end_time -- 有效期FROM user_coupons uc -- 用户优惠券关联表JOIN coupons c ON uc.coupon_id = c.coupon_id -- 关联优惠券表WHERE uc.user_id = 88888 AND uc.is_used = 0 -- 未使用 AND c.end_time >= NOW(); -- 未过期(当前时间在有效期内)注释:用户下单时展示可用优惠券,条件需同时满足“未使用”和“未过期”,确保推荐有效的优惠券。
2、活动分析
(37)统计促销活动期间的销售额
SELECT a.activity_id, -- 活动ID a.activity_name, -- 活动名称(如:"618大促") SUM(o.pay_amount) AS activity_sales, -- 活动期间总销售额 COUNT(DISTINCT o.order_id) AS order_count -- 活动订单数FROM activities a -- 活动表-- 关联订单与活动的关联表JOIN order_promotions op ON a.activity_id = op.activity_id-- 关联订单表JOIN orders o ON op.order_id = o.order_idWHERE a.activity_name = '618大促' -- 指定活动 AND o.order_status IN (1, 2, 3) -- 有效订单GROUP BY a.activity_id, a.activity_name;注释:评估活动效果的核心指标,我们通过对比活动前后的销售额和订单数,判断活动是否达到预期,为后续活动策划提供参考。
(38)查询活动期间使用优惠券的订单占比
SELECT -- 用券订单占比=使用优惠券的订单数/总订单数 ROUND(COUNT(DISTINCT CASE WHEN op.coupon_id IS NOT NULL THEN o.order_id END) / COUNT(DISTINCT o.order_id)*100, 2) AS coupon_use_rateFROM orders o -- 订单表-- 左连接:关联订单使用的优惠券LEFT JOIN order_promotions op ON o.order_id = op.order_idWHERE -- 活动期间(如:618活动:6月1日-6月20日) o.create_time BETWEEN '2024-06-01' AND '2024-06-20' AND o.order_status IN (1, 2, 3); -- 有效订单注释:分析优惠券对活动转化的拉动作用,若用券订单占比低,可能是优惠券门槛过高或宣传不足,我们可调整优惠券规则或加强推广。
(39)查询近7天每日新增用户数
-- 统计最近7天每天的新注册用户数量SELECT DATE(register_time) AS register_date, -- 注册日期(仅日期部分) COUNT(user_id) AS new_user_count -- 新增用户数FROM usersWHERE register_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) -- 近7天 AND register_time < CURDATE() -- 排除今天(未结束,数据不完整)GROUP BY register_dateORDER BY register_date; -- 按日期排序场景:评估近期拉新活动效果(如:广告投放、裂变活动),若某天新增用户骤降,需检查渠道是否异常;若骤增,可分析原因并复制成功经验。
(40)分析优惠券使用转化率(领取后使用的比例)
-- 计算每张优惠券的使用转化率:使用次数/领取次数SELECT c.coupon_id, c.coupon_name, -- 优惠券名称(如:"满200减50") -- 使用次数(已使用的用户数) COUNT(DISTINCT CASE WHEN uc.is_used = 1 THEN uc.user_id END) / -- 领取次数(总领取用户数) COUNT(DISTINCT uc.user_id) AS conversion_rateFROM user_coupons uc -- 用户领取优惠券表-- 关联优惠券表获取名称JOIN coupons c ON uc.coupon_id = c.coupon_idGROUP BY c.coupon_id, c.coupon_nameORDER BY conversion_rate DESC; -- 按转化率降序场景:评估优惠券吸引力,低转化率的优惠券可能存在门槛过高、优惠力度不足等问题,我们可调整规则(如:降低门槛、提高面额)提升使用率。
五、库存与物流管理
1、库存操作
(41)检查商品库存是否充足
SELECT product_id, product_name, stock_quantity -- 当前库存FROM products WHERE product_id IN (1001, 1002) -- 待检查的商品ID(如:订单中的商品) AND stock_quantity < 5; -- 库存不足5个(可根据订单数量动态调整阈值)注释:下单前的关键校验步骤,若查询结果不为空,说明部分商品库存不足,需提示用户或阻止下单,避免超卖。
(42)标记商品为缺货
UPDATE products SET is_stockout = 1, -- 1=缺货状态(前端可隐藏购买按钮) update_time = NOW() -- 记录状态更新时间WHERE stock_quantity = 0; -- 库存为0时自动标记注释:可通过定时任务执行,当库存为0时自动标记缺货,提升用户体验(避免用户下单后发现无货),同时便于我们运营人员及时补货。
(43)批量查询商品库存(用在补货提醒)
SELECT product_id, product_name, stock_quantity, -- 当前库存 -- 计算库存可售天数(按近30天平均销量) ROUND(stock_quantity / NULLIF(avg_daily_sales, 0), 1) AS sellable_daysFROM ( -- 子查询:计算近30天平均日销量 SELECT p.product_id, p.product_name, p.stock_quantity, -- 总销量/30天=平均日销量(NULLIF避免除以0) SUM(oi.quantity) / NULLIF(30, 0) AS avg_daily_sales FROM products p -- 左连接:关联近30天的订单详情 LEFT JOIN order_items oi ON p.product_id = oi.product_id -- 左连接:关联有效订单 LEFT JOIN orders o ON oi.order_id = o.order_id AND o.create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY) AND o.order_status IN (1, 2, 3) GROUP BY p.product_id, p.product_name, p.stock_quantity) AS tempWHERE sellable_days < 7; -- 可售天数不足7天,需要补货注释:供应链管理核心查询,通过历史销量预测库存耗尽时间,可售天数不足7天的商品需优先补货,避免缺货;新商品(无历史销量)可通过NULLIF处理,避免计算错误。
(44)统计仓库库存分布
SELECT w.warehouse_id, -- 仓库ID w.warehouse_name, -- 仓库名称(如:"上海仓"、"广州仓") c.category_name, -- 商品分类 SUM(i.stock_quantity) AS total_stock -- 该仓库的分类库存总量FROM inventory i -- 库存表(分仓库存储)JOIN warehouses w ON i.warehouse_id = w.warehouse_id -- 关联仓库表JOIN products p ON i.product_id = p.product_id -- 关联商品表JOIN categories c ON p.category_id = c.category_id -- 关联类目表GROUP BY w.warehouse_id, w.warehouse_name, c.category_nameORDER BY w.warehouse_id, total_stock DESC; -- 按仓库和库存降序注释:用于平衡各仓库的库存分布,若某类目在A仓库库存积压而在B仓库缺货,可进行调拨;同时为我们仓库选址和备货提供数据支持(如:在订单密集区增加热门类目库存)。
2、物流操作
(45)新增物流信息
INSERT INTO logistics ( order_id, -- 关联的订单ID logistics_company, -- 快递公司(如:"顺丰"、"圆通") logistics_no, -- 物流单号(唯一,用在查询轨迹) send_time, -- 发货时间 status -- 物流状态(1=已发货,2=运输中,3=已签收等)) VALUES ('ORD20240520001', '顺丰速运', 'SF1234567890123', -- 完整物流单号(需准确无误) NOW(), -- 用当前时间作为发货时间 1 -- 初始状态为“已发货”);注释:物流信息需与订单一一对应,logistics_no需完整准确(便于用户查询轨迹),send_time和status用在跟踪物流进度,后续可通过UPDATE语句更新状态(如:运输中、已签收)。
(46)更新物流状态(已签收)
UPDATE logistics SET status = 3, -- 3=已签收状态 receive_time = NOW(), -- 记录签收时间 update_time = NOW() -- 记录状态更新时间WHERE logistics_no = 'SF1234567890123' -- 按物流单号定位 AND order_id = 'ORD20240520001'; -- 双重条件确保准确性(防单号重复)注释:签收时更新状态并记录receive_time,形成完整的物流时间线;同时匹配logistics_no和order_id,避免因单号重复导致的错误更新,确保数据准确性。
(47)查询订单物流轨迹
SELECT l.logistics_company, -- 快递公司 l.logistics_no, -- 物流单号 l.send_time, -- 发货时间 l.receive_time, -- 签收时间 -- 转换状态码为文字描述(提升可读性) CASE l.status WHEN 1 THEN '已发货' WHEN 2 THEN '运输中' WHEN 3 THEN '已签收' ELSE '异常' END AS status_text, -- 关联收货地址信息 ua.receiver, -- 收货人 ua.phone, -- 联系电话 CONCAT(ua.province, ua.city, ua.detail_address) AS receive_address -- 完整收货地址FROM logistics l -- 物流表JOIN orders o ON l.order_id = o.order_id -- 关联订单主表JOIN user_addresses ua ON o.address_id = ua.address_id -- 关联收货地址表WHERE l.order_id = 'ORD20240520001'; -- 按订单号查询注释:通过多表关联一次性获取物流信息、收货地址和联系人,CASE函数将状态码转换为用户易懂的文字,方便用户查看完整物流轨迹,提升透明度。
(48)统计各快递公司的发货效率(平均配送时长)
SELECT logistics_company, -- 快递公司 -- 计算平均配送时长(签收时间-发货时间,单位:小时) AVG(TIMESTAMPDIFF(HOUR, send_time, receive_time)) AS avg_delivery_hours, COUNT(logistics_no) AS delivery_count -- 配送单量FROM logistics WHERE status = 3 -- 仅统计已签收的订单(确保配送完成) AND send_time BETWEEN '2024-05-01' AND '2024-05-31' -- 限定5月数据GROUP BY logistics_company -- 按快递公司分组ORDER BY avg_delivery_hours; -- 按平均时长升序(最快的在前)注释:TIMESTAMPDIFF函数计算发货到签收的小时数,用在评估快递公司效率,结果可用在选择合作物流商(优先与配送快、单量大的公司合作),优化物流体验。
3、多仓调拨
(49)查询商品在各仓库的库存分布
-- 查看指定商品在所有仓库的库存数量SELECT w.warehouse_id, -- 仓库ID w.warehouse_name, -- 仓库名称(如:"广州保税仓"、"上海自贸区仓") i.stock_quantity, -- 该仓库的库存 i.locked_quantity -- 已锁定库存(如:已下单未发货)FROM inventory i -- 库存表(分仓库)JOIN warehouses w ON i.warehouse_id = w.warehouse_id -- 关联仓库表WHERE i.product_id = 2001 -- 指定商品ORDER BY i.stock_quantity DESC; -- 按库存降序注释:多仓模式下,需掌握商品在各仓库的分布,为调拨决策提供依据(如:A仓库缺货时从B仓库调拨);locked_quantity用于判断实际可调拨库存(可用库存=stock_quantity - locked_quantity)。
(50)生成库存调拨单(从A仓库调往B仓库)
-- 新增调拨单,记录调拨方向和数量INSERT INTO inventory_transfers ( transfer_id, -- 调拨单ID product_id, -- 调拨商品ID from_warehouse_id, -- 调出仓库ID to_warehouse_id, -- 调入仓库ID quantity, -- 调拨数量 transfer_status, -- 状态(0=待审核,1=已调出,2=已入库) apply_time -- 申请时间) VALUES ('TF20240601001', 2001, -- 商品ID 101, -- 广州仓(调出) 102, -- 上海仓(调入) 50, -- 调拨50件 0, -- 待审核 NOW() -- 申请时间);注释:调拨单需明确调出/调入仓库、数量和状态,状态流转用在跟踪调拨全流程(申请→审核→调出→入库),确保库存变动可追溯。
(51)调拨后更新两仓库库存
-- 事务:确保调出和调入仓库库存同步更新BEGIN; -- 开始事务-- 调出仓库减少库存UPDATE inventory SET stock_quantity = stock_quantity - 50, update_time = NOW()WHERE product_id = 2001 AND warehouse_id = 101;-- 调入仓库增加库存UPDATE inventory SET stock_quantity = stock_quantity + 50, update_time = NOW()WHERE product_id = 2001 AND warehouse_id = 102;-- 更新调拨单状态为“已调出”UPDATE inventory_transfers SET transfer_status = 1, out_time = NOW() WHERE transfer_id = 'TF20240601001';COMMIT; -- 提交事务(若失败则执行ROLLBACK回滚)注释:使用事务保证库存数据一致性,避免单边更新(如:仅减少调出仓库库存而未增加调入仓库库存)导致的库存错乱;状态更新同步记录时间,形成完整的操作日志。
(52)统计仓库间调拨频率(优化调拨策略)
-- 统计各仓库间的调拨次数和总数量SELECT from_warehouse_id, w1.warehouse_name AS 调出仓库, to_warehouse_id, w2.warehouse_name AS 调入仓库, COUNT(transfer_id) AS 调拨次数, SUM(quantity) AS 总调拨数量FROM inventory_transfers -- 调拨单表JOIN warehouses w1 ON from_warehouse_id = w1.warehouse_id -- 关联调出仓库JOIN warehouses w2 ON to_warehouse_id = w2.warehouse_id -- 关联调入仓库WHERE transfer_status = 2 -- 已完成的调拨 AND apply_time BETWEEN '2024-01-01' AND '2024-06-30' -- 上半年数据GROUP BY from_warehouse_id, to_warehouse_id, w1.warehouse_name, w2.warehouse_nameORDER BY 总调拨数量 DESC; -- 按总调拨数量降序注释:分析高频调拨路线(如:A仓库→B仓库频繁调拨),可优化我们仓库备货策略(如:在B仓库增加该商品的安全库存),减少调拨频率和物流成本。
六、售后与评价管理
(53)新增商品评价
INSERT INTO product_reviews ( review_id, -- 评价ID order_id, -- 关联的订单(确保已购买才能评价) product_id, -- 被评价商品ID user_id, -- 评价用户ID rating, -- 评分(1-5星,5星为最佳) content, -- 评价内容(文字描述) review_time, -- 评价时间 is_anonymous -- 是否匿名(1=匿名,0=不匿名)) VALUES ('REV20240521001','ORD20240520001', -- 关联订单(防刷评) 1001, -- 商品ID 88888, -- 用户ID 5, -- 五星好评'音质很好,续航持久', -- 评价内容 NOW(), -- 评价时间 0 -- 不匿名);注释:关联order_id是防止刷评的关键(确保用户只能评价已购买的商品),is_anonymous字段保护用户隐私,前端可根据该值决定是否显示用户名。
(54)查询商品的平均评分及评价数
SELECT p.product_id, -- 商品ID p.product_name, -- 商品名称 ROUND(AVG(r.rating), 1) AS avg_rating, -- 平均评分(保留1位小数) COUNT(r.review_id) AS review_count -- 总评价数FROM products p -- 商品表LEFT JOIN product_reviews r ON p.product_id = r.product_id -- 关联评价表WHERE p.product_id = 1001 -- 查询指定商品GROUP BY p.product_id, p.product_name; -- 按商品分组注释:商品详情页核心数据,LEFT JOIN确保即使商品无评价也能返回信息(平均分为NULL,前端可处理为“暂无评价”),ROUND函数使评分更易读,帮助用户决策。
(55)申请退货
INSERT INTO returns ( return_id, -- 退货单ID order_id, -- 关联的原订单ID user_id, -- 申请用户ID product_id, -- 退货商品ID return_quantity, -- 退货数量 reason, -- 退货原因(如:"质量问题"、"尺寸不符") apply_time, -- 申请时间 return_status -- 状态(0=申请中,1=已同意,2=已拒绝)) VALUES ('RET20240522001','ORD20240520001', -- 关联原订单 88888, -- 用户ID 1001, -- 商品ID 1, -- 退货1件'尺寸不符', -- 退货原因 NOW(), -- 申请时间 0 -- 初始状态为“申请中”);注释:退货单与原订单强关联,记录退货数量和原因,便于我们售后人员处理,return_status跟踪退货进度(申请中→已同意→已退货→已退款)。
(56)同意退货后更新订单状态
-- 事务:确保退货状态和订单状态同步更新(原子性操作)BEGIN; -- 开始事务-- 更新退货单状态为“已同意”UPDATE returns SET return_status = 1, -- 1=已同意 approve_time = NOW() -- 记录同意时间WHERE return_id = 'RET20240522001';-- 同步更新原订单状态为“退货中”UPDATE orders SET order_status = 4, -- 4=退货中(自定义状态码) update_time = NOW() -- 记录状态更新时间WHERE order_id = 'ORD20240520001';COMMIT; -- 提交事务(若失败则执行ROLLBACK回滚)注释:使用事务(BEGIN/COMMIT)确保两个更新操作要么同时成功,要么同时失败,避免数据不一致(如:退货单同意但订单状态未更新);订单状态同步后,前端可向用户展示“退货处理中”标识,提升透明度。
七、数据分析与报表
1、核心业务分析
(57)统计每日订单量与销售额
SELECT DATE(create_time) AS order_date, -- 按日期分组(忽略时分秒) COUNT(DISTINCT order_id) AS order_count, -- 订单量(去重,避免重复统计) SUM(pay_amount) AS total_sales -- 销售额(实付金额总和)FROM orders WHERE order_status IN (1, 2, 3) -- 已支付/已完成的有效订单 AND create_time BETWEEN '2024-05-01' AND '2024-05-31' -- 限定5月数据GROUP BY DATE(create_time) -- 按日期分组ORDER BY order_date; -- 按日期排序注释:电商运营核心报表,DATE(create_time)将时间戳转换为日期,COUNT(DISTINCT)确保每个订单只被统计一次,用在监控每日销售趋势。
(58)热销商品TOP10(按销量)
SELECT oi.product_id, -- 商品ID p.product_name, -- 商品名称 SUM(oi.quantity) AS total_sales_quantity -- 总销量FROM order_items oi -- 订单详情表JOIN products p ON oi.product_id = p.product_id -- 关联商品表JOIN orders o ON oi.order_id = o.order_id -- 关联订单主表WHERE o.order_status IN (1, 2, 3) -- 仅统计有效订单(已支付/已发货/已完成) AND o.create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY) -- 限定近30天数据GROUP BY oi.product_id, p.product_name -- 按商品分组ORDER BY total_sales_quantity DESC -- 按销量倒序排列LIMIT 10; -- 取前10名注释:通过多表关联筛选有效订单,SUM(quantity)计算商品总销量,结果可用在首页推荐、库存调整和采购计划制定,是我们运营决策的重要依据。
(59)新用户转化率(注册后7天内下单)
SELECT COUNT(DISTINCT u.user_id) AS total_new_users, -- 总新用户数(近30天注册) COUNT(DISTINCT o.user_id) AS paid_users, -- 7天内下单的用户数 -- 转化率=下单用户数/总新用户数(保留2位小数,百分比形式) ROUND(COUNT(DISTINCT o.user_id)/COUNT(DISTINCT u.user_id)*100, 2) AS conversion_rateFROM users u -- 用户表LEFT JOIN orders o ON u.user_id = o.user_id -- 关联条件:订单创建时间在注册后7天内 AND o.create_time BETWEEN u.register_time AND DATE_ADD(u.register_time, INTERVAL 7 DAY) AND o.order_status IN (1, 2, 3) -- 仅统计有效订单WHERE u.register_time BETWEEN '2024-05-01' AND '2024-05-31'; -- 限定5月新注册用户注释:LEFT JOIN确保所有新用户都被统计(包括未下单用户),DATE_ADD限定7天转化窗口期,ROUND函数将转化率格式化,用于我们评估拉新活动的质量和用户留存效果。
2、财务报表
(60)统计每日退款金额
SELECT DATE(refund_time) AS refund_date, -- 退款日期 SUM(refund_amount) AS total_refund -- 当日总退款金额FROM refunds -- 退款表WHERE refund_status = 2 -- 2=退款成功(仅统计实际退款) AND refund_time BETWEEN '2024-05-01' AND '2024-05-31' -- 限定5月GROUP BY refund_dateORDER BY refund_date; -- 按日期排序注释:财务报表必备指标,监控每日退款金额和趋势,若某日退款骤增,我们需排查原因(如:批量质量问题);同时用于核算实际营收(销售额-退款金额)。
(61)查询高价值用户(年消费超10000元)
SELECT u.user_id, u.username, u.phone, -- 联系方式(用于VIP服务) SUM(o.pay_amount) AS annual_consumption -- 年消费总额FROM users u -- 用户表JOIN orders o ON u.user_id = o.user_id -- 关联订单表WHERE -- 限定当年(2024年) o.create_time BETWEEN '2024-01-01' AND '2024-12-31' AND o.order_status IN (1, 2, 3) -- 有效订单GROUP BY u.user_id, u.username, u.phoneHAVING annual_consumption >= 10000 -- 筛选高价值用户(年消费超10000元)ORDER BY annual_consumption DESC; -- 按消费额降序注释:用于VIP客户分层管理,可为高价值用户提供专属服务(如:一对一客服、优先发货、生日礼遇),提升用户忠诚度和复购率。
八、系统与特殊场景管理
1、系统管理
(62)清理过期的未支付订单
DELETE FROM orders WHERE order_status = 0 -- 状态为未支付 AND create_time < DATE_SUB(NOW(), INTERVAL 24 HOUR); -- 超过24小时未支付注释:通过定时任务(如:每日凌晨)执行,释放过期订单占用的库存、优惠券等资源,避免资源浪费;删除前可先备份订单数据(如:归档到历史表)。
(63)备份用户订单数据(按月份)
-- 创建当月订单备份表(如:2024年5月)CREATE TABLE IF NOT EXISTS orders_backup_202405 ASSELECT * FROM orders WHERE create_time BETWEEN '2024-05-01' AND '2024-05-31'; -- 5月数据注释:定期备份历史订单数据,减轻主表存储压力,提升查询性能;备份表可按月份分区,便于后续数据查询和分析(如:年度报表)。
(64)统计各表数据量(系统监控)
-- 统计核心表的数据量,用在系统监控和扩容预警SELECT 'users' AS table_name, COUNT(*) AS row_count UNION ALLSELECT 'products', COUNT(*) UNION ALLSELECT 'orders', COUNT(*) UNION ALLSELECT 'order_items', COUNT(*) UNION ALLSELECT 'cart_items', COUNT(*);注释:系统运维常用查询,监控核心表数据增长趋势,若某表数据量骤增(如:订单表),需提前扩容数据库或优化索引,避免性能下降。
2、跨境电商税务
(65)统计单票订单的进口关税
-- 计算订单的进口关税(关税=完税价格×关税税率)SELECT o.order_id, o.product_id, p.product_name, o.quantity, -- 购买数量 p.unit_price AS 单价, p.unit_price * o.quantity AS 完税价格, -- 完税价格=单价×数量 t.tariff_rate AS 关税税率, -- 从税率表获取对应商品的关税税率 (p.unit_price * o.quantity) * t.tariff_rate AS 进口关税FROM cross_border_orders o -- 跨境订单表JOIN products p ON o.product_id = p.product_id -- 关联商品表JOIN tariff_rates t ON p.hs_code = t.hs_code -- 通过HS编码关联关税税率表WHERE o.order_id = 'CB20240601001'; -- 单票订单注释:跨境订单需按商品HS编码(海关编码)匹配关税税率,完税价格通常为商品成交价格,用在我们向海关申报纳税,确保合规。
(66)按月统计增值税总额(含进口增值税)
-- 统计每月进口增值税和国内增值税总和SELECT DATE_FORMAT(o.order_time, '%Y-%m') AS 月份, -- 进口增值税(进口环节缴纳,税率通常为13%) SUM(o.dutiable_value * 0.13) AS 进口增值税, -- 国内增值税(平台销售环节缴纳,按不含税销售额计算) SUM(o.pay_amount / 1.13 * 0.13) AS 国内增值税, -- 合计 SUM(o.dutiable_value * 0.13 + o.pay_amount / 1.13 * 0.13) AS 增值税总额FROM cross_border_orders o -- 跨境订单表WHERE o.order_status = 'paid' -- 已支付订单 AND o.order_time BETWEEN '2024-01-01' AND '2024-12-31' -- 当年数据GROUP BY 月份ORDER BY 月份;注释:跨境电商需区分进口环节增值税(由海关征收)和国内销售环节增值税(由税务机关征收),按月份统计便于税务申报和财务核算。
(67)查询异常关税订单(税率或完税价格异常)
-- 筛选关税计算异常的订单(如:税率为0但属于应税商品)SELECT o.order_id, p.hs_code, -- 商品HS编码 p.product_name, t.tariff_rate, -- 关税税率 o.dutiable_value -- 完税价格FROM cross_border_orders o -- 跨境订单表JOIN products p ON o.product_id = p.product_id -- 关联商品表LEFT JOIN tariff_rates t ON p.hs_code = t.hs_code -- 关联关税税率表WHERE (t.tariff_rate IS NULL OR t.tariff_rate = 0) -- 无税率或税率为0 AND p.is_taxable = 1; -- 商品标记为应税注释:通过HS编码匹配异常检测,避免因税率错误导致的漏税或申报问题,确保跨境业务合规;异常订单需人工审核修正。
3、用户分层运营
(68)RFM模型用户分层(最近消费、消费频率、消费金额)
-- 按RFM指标将用户分为5层(如:高价值、潜力、流失等)WITH rfm AS ( SELECT user_id, -- 最近消费时间(距今天数,越小越好) DATEDIFF(NOW(), MAX(order_time)) AS recency, -- 消费频率(订单数,越大越好) COUNT(order_id) AS frequency, -- 消费金额(总金额,越大越好) SUM(pay_amount) AS monetary FROM orders WHERE order_status = 'paid' AND order_time >= DATE_SUB(NOW(), INTERVAL 180 DAY) -- 近6个月数据 GROUP BY user_id)SELECT user_id, recency, frequency, monetary, -- 分层规则(示例): -- R≤30天、F≥5次、M≥5000 → 高价值用户 -- R≤30天、F<5次、M≥3000 → 潜力用户 -- R>90天、F≥3 → 流失预警用户 -- 其他 → 普通用户 CASE WHEN recency <= 30 AND frequency >= 5 AND monetary >= 5000 THEN '高价值用户' WHEN recency <= 30 AND frequency < 5 AND monetary >= 3000 THEN '潜力用户' WHEN recency > 90 AND frequency >= 3 THEN '流失预警用户' ELSE '普通用户' END AS user_levelFROM rfm;注释:RFM模型是用户分层的经典方法,通过最近消费(Recency)、消费频率(Frequency)、消费金额(Monetary)三个维度划分用户群体,为精细化运营提供依据(如:对高价值用户提供专属权益,对流失用户推送召回优惠)。
(69)高价值用户专属权益发放
-- 给高价值用户发放专属优惠券(批量操作)INSERT INTO user_coupons (user_id, coupon_id, get_time, is_used)SELECT user_id,'VIP202406', -- 高价值用户专属券(如:"满1000减200") NOW(), -- 发放时间 0 -- 未使用FROM user_levels -- 引用RFM分层结果表(存储user_id和user_level)WHERE user_level = '高价值用户' -- 排除已领取用户(避免重复发放) AND user_id NOT IN (SELECT user_id FROM user_coupons WHERE coupon_id = 'VIP202406');注释:针对高价值用户定向发放高力度优惠券,提升用户满意度和复购率;NOT IN条件避免重复发放,节省我们的营销成本。
(70)流失用户召回筛选(近90天未消费但历史有购买)
-- 筛选近90天未消费但历史有2次以上购买的用户(可召回)SELECT u.user_id, u.username, MAX(o.order_time) AS last_order_time, -- 最后消费时间 COUNT(o.order_id) AS total_orders -- 历史订单数FROM users u -- 用户表JOIN orders o ON u.user_id = o.user_id -- 关联订单表WHERE o.order_status = 'paid' -- 有效订单 -- 近90天无消费 AND o.order_time < DATE_SUB(NOW(), INTERVAL 90 DAY) -- 历史至少2单(有复购记录,值得召回) AND EXISTS ( SELECT 1 FROM orders WHERE user_id = u.user_id AND order_status = 'paid' GROUP BY user_id HAVING COUNT(*) >= 2 )GROUP BY u.user_id, u.username;注释:识别有复购历史但近期未消费的用户,可通过定向优惠(如:“回归礼包”、“专属折扣”)激活,挽回流失用户,提升整体复购率。
(71)新用户首单后7天复购激励
-- 筛选首单后7天内未复购的新用户,推送复购券SELECT u.user_id, u.register_time, -- 注册时间 o1.order_time AS first_order_time, -- 首单时间 DATEDIFF(NOW(), o1.order_time) AS days_since_first -- 首单后天数FROM users u -- 用户表JOIN orders o1 ON u.user_id = o1.user_id -- 首单-- 左连接:关联首单后7天内的复购单LEFT JOIN orders o2 ON u.user_id = o2.user_id AND o2.order_time > o1.order_time AND o2.order_time <= DATE_ADD(o1.order_time, INTERVAL 7 DAY)WHERE o1.is_first_order = 1 -- 标记为首单 AND o2.order_id IS NULL -- 7天内无复购 -- 首单后14天内(召回窗口期,超过则效果下降) AND DATEDIFF(NOW(), o1.order_time) <= 14;注释:新用户首单后7-14天是复购关键期,筛选未复购用户推送限时复购券(如:“首单后14天内再购立减30元”),可显著提升新用户留存率,培养消费习惯。
总之,这份71条SQL语句模板就是我们电商人的“数据小助手”。不管我们是搞开发、做分析,还是干运营,日常工作里碰到的商品、订单、用户这些数据问题,我们基本都能在这儿找到现成的解法。
夜雨聆风