1. SQL工程项目全景
很多初学者把 SQL 等同于“在数据库里查数据”,但在真实工程项目中,SQL 更像是一条贯穿业务系统的数据管道:它承接上游产生的原始数据,经过清洗、聚合、关联,最终输出给报表、接口、风控规则或算法特征。理解 SQL 在工程中的角色,关键不是记住语法,而是看清它在整条数据流中的位置,以及它和谁协作、产出什么、被谁消费。
SQL 在工程项目中的三种角色
第一种是取数工具:面向业务人员或分析师,快速从生产库、数仓中拉取明细或汇总结果,典型场景是“查一下上周华东区的订单量”。第二种是数据加工逻辑:SQL 被写入调度任务,按天/小时运行,把原始表加工成宽表、指标表,供下游复用。第三种是业务规则载体:例如风控中的“同一设备 24 小时内下单超过 5 次则标记异常”,这条规则最终会落成一段带窗口函数的 SQL。三种角色的共同点是:SQL 不是孤立语句,而是有输入表、有处理逻辑、有输出表、有运行频率的工程对象。
典型数据流:从业务库到消费端
一个常见的电商项目数据流可以这样描述:业务系统(订单、用户、商品)写入 MySQL 生产库;通过 CDC 或定时抽取进入数仓 ODS 层;在 DWD 层做清洗与标准化(去重、字段统一、时间格式转换);在 DWS 层按主题聚合(用户粒度、商品粒度);最后在 ADS 层生成报表或接口所需的结果表。SQL 主要工作在 DWD 之后的加工环节,而 ODS 层通常保留原始结构。理解这条链路,才能判断一段 SQL 应该写在哪一层、依赖哪些上游表、产出给谁用。
开发协作流程:SQL 不是一个人写完就结束
在团队中,一段 SQL 从需求到上线通常经历几个环节。需求方提出指标口径,例如“日活跃用户数 = 当日有登录行为的去重用户数”;数据开发据此确认上游表是否包含登录日志、时间字段是否带时区;然后编写 SQL 并在小数据集上验证;接着由测试或同事做结果比对,确认与历史口径一致;最后配置调度、设置依赖和告警,上线后监控产出时间和数据量波动。这个流程里,SQL 的正确性只是基础,可维护性、可追溯性和稳定性同样重要。
课程实战项目介绍
本课程围绕一个“电商订单分析平台”展开。项目包含四张核心表:orders(订单表,含订单号、用户 ID、商品 ID、金额、下单时间、状态)、users(用户表,含注册时间、城市、会员等级)、products(商品表,含类目、价格、上架时间)、order_items(订单明细表,含订单号、商品 ID、数量、单价)。数据量按示例设定为:订单约 500 万行,用户约 80 万行,商品约 2 万行,明细约 1200 万行。这些数字用于说明量级和性能考虑,并非真实运行结果。
项目将逐步完成以下任务:从 ODS 层抽取数据到 DWD 层做清洗;计算每日 GMV、订单量、客单价;按城市和会员等级做用户分层;识别复购用户和高价值商品;最终产出一张 ADS 层的日报表,包含日期、城市、GMV、订单数、活跃用户数、客单价六个字段。每个任务都会给出建表语句、加工 SQL、预期结果示例和验证方法。
一个可执行的最小示例
以“统计 2024-06-01 当天各城市 GMV”为例,输入是 orders 和 users,输出是城市维度的汇总。示例 SQL 如下:
SELECT
u.city,
COUNT(DISTINCT o.order_id) AS order_cnt,
SUM(o.amount) AS gmv,
ROUND(SUM(o.amount) / COUNT(DISTINCT o.order_id), 2) AS avg_order_value
FROM orders o
JOIN users u ON o.user_id = u.user_id
WHERE o.order_date = '2024-06-01'
AND o.status = 'paid'
GROUP BY u.city
ORDER BY gmv DESC;
运行后应得到类似结果(示例数据,非实测):北京 GMV 约 128 万、订单数约 1.6 万、客单价约 80 元;上海 GMV 约 115 万、订单数约 1.4 万、客单价约 82 元。验证时重点检查三点:订单状态是否只取已支付、城市字段是否有空值、去重口径是否与需求一致。如果结果与历史日报差异超过 5%,需要回溯上游数据是否延迟或重复。
工程视角下的 SQL 质量判断
一段 SQL 在工程项目中是否合格,可以从四个维度判断:正确性——结果与业务口径一致;性能——在目标数据量下运行时间可接受,避免全表扫描和笛卡尔积;可维护性——字段命名清晰、逻辑分层、注释说明口径;稳定性——对空值、重复数据、时间边界有处理,不会因上游波动导致任务失败。这四点会贯穿后续所有章节的练习。
理解全景之后,接下来的工作就是把这条数据链路拆开,从建表、查询、关联、聚合到调度,一步步把 SQL 写成可交付的工程产物。