我们小群经常有刚转型数据分析师的朋友,来问我这个问题"SQL 要学到什么程度"。我的回答是:取决于你想做到什么位置。
我经常说,一具体就深刻,所以今天,我把数据分析师需要的数据库知识分成五层,每一层配一个你一定遇到过(或者即将遇到)的真实工作场景。对照一下,就知道自己卡在哪儿了。
第一层:SQL 基础——能自己取数,不求人
你刚入职一家电商公司,运营同事说"帮我拉一下上个月各品类的销售额"。
这是数据分析师最高频的日常。SELECT、WHERE、GROUP BY、ORDER BY,从订单表按品类分组求和,按金额降序排。SUM()、COUNT()、AVG() 算总销售额、订单数、客单价。订单表里只有 product_id,品类名称在商品表里,LEFT JOIN 关联一下。日期函数按月截断,筛选"上个月"。
这一层目标就一个:别人给你一个取数需求,10 分钟内写出 SQL 交付。
做到这一步不难,但很多人卡在一个心态上——觉得取数是"低级活",不愿意练手速。实际上取数快不快,直接决定你在团队里的存活质量。需求排着队等你的时候,SQL 写得慢就是在给自己挖坑。
第二层:进阶查询——复杂业务逻辑不怕了
产品经理问你"最近三个月每月新用户留存率多少?次月还活跃的占比?"
简单 GROUP BY 搞不定了。你得用 CTE(WITH 语句)先算出每个用户的首次登录月份,再和后续月份的活跃表做关联。窗口函数 ROW_NUMBER() 去重取最早记录,LAG() 做环比,SUM() OVER(PARTITION BY ...) 算累计值。CASE WHEN 把 GMV 按区间分成高中低价值用户。UNION 合并 App 端和小程序端的行为数据。
面试里常考的"转化率下降怎么分析""用户画像标签怎么做",落到 SQL 层面,全是第二层的活。
所以,第二层的分水岭不在语法本身,而在你能不能把一个模糊的业务问题拆成清晰的查询步骤。语法翻翻文档就会了,拆问题的能力得靠真实需求练。
第三层:数据建模与表结构——知道数据从哪来、怎么存
你发现两个部门算出来的"月活用户数"差了 20 万,老板问到底哪个对。
太常见了。我见过的数据团队,十个有八个在口径打架上耗过大量时间。
问题往往出在表结构上。用户表、订单表、行为日志表之间到底是一对多还是多对多?一个用户可以有多个设备 ID,按设备去重和按用户 ID 去重,结果差 20 万太正常了。
你还得理解数据仓库分层:ODS(原始层)→ DWD(明细层)→ DWS(汇总层)→ ADS(应用层)。直接查 ODS 可能拿到脏数据,查 DWS 可能口径已经被加工过。两个部门分别从不同层取数,算出来的数不一样一点都不奇怪。
DAU 按 user_id 去重还是 device_id 去重?GMV 包不包含退款订单?这些不看建表逻辑和 ETL 代码根本判断不了。
这一层是大多数初中级分析师的卡点。会写 SQL 但不理解数据模型,取出来的数经常"算不对",每次被质疑都只能说"我再查查"。
第四层:性能优化——让查询跑得快,别惹事
你写了一条 SQL 查半年的用户行为明细,跑了 40 分钟还没出结果,数据平台同事找过来:"你的查询把集群资源占满了。"
这时候你得懂索引原理。WHERE 条件里的字段没有索引,数据库就得全表扫描。给高频过滤字段建索引,查询从 40 分钟降到 10 秒,不夸张。用 EXPLAIN 看执行计划,识别全表扫描和临时表排序这些性能杀手。行为日志表按天分区的话,查询加上日期条件就只扫对应分区。
不同引擎差异也得清楚。Hive 里 COUNT(DISTINCT) 很慢,得用 GROUP BY 加 COUNT 两步替代。公司用 MySQL 还是 ClickHouse 还是 Presto,优化策略完全不同。
说实话,这一层很多分析师一辈子都不会碰到——如果你们公司数据量小,或者有专门的数据工程师帮你优化,可能根本不需要操心。但一旦碰到了,不懂就会很被动。
第五层:数据治理与权限——站在全局看数据资产
你升到数据团队 leader,老板说"我们的数据太乱了,同一个指标各部门各算各的,你来牵头治理一下"。
数据治理难搞的根本原因在这:大家觉得数据是数据分析师的事,不关业务的事。但数据采集离了业务参与根本做不了,分析只是后面的环节。
企业的数据分三层:公开数据人人可得;ERP、CRM、OA 里的私有数据,质量差、口径混乱、权限复杂;员工脑子里的隐性知识,最值钱也最难整理。
到了这一层,光会 SQL 不够了。你得用数据字典管住每张表的字段含义、更新频率和负责人。建自动化校验规则监控数据质量——某张表今天数据量比昨天少了一半?某个字段空值率突然飙升?得及时发现。权限体系要设计好,不能卡太死让业务取不到数,也不能放太开导致泄露。
最重要的一件事:把核心指标的定义、计算口径、数据来源固化成统一的指标层,所有部门从同一个地方取数。口径打架的问题,只有在源头上统一才能真正解决。
五层的递进关系:第一层让你能干活,第二层让你干好活,第三层让你知道数据对不对,第四层让你跑得快不添乱,第五层让你把整个数据体系搭起来。
如果你现在卡在第二到第三层的过渡,我的建议是别再刷 SQL 题了。多花时间去读你们公司的表结构文档和 ETL 代码,搞清楚数据怎么从业务系统流到你查的那张表的,比多会一个窗口函数管用得多。