收官篇:一张图串起SQL面试所有知识点
20天,20道题,从窗口函数到执行计划,从NULL陷阱到分区优化。今天做一个大总结,把所有知识点串起来,帮你在面试前做最后的查漏补缺。
SQL执行顺序:所有优化的基础
这是面试必考的第一道题,也是理解所有SQL行为的基础。记住这个顺序:
FROM / JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT
每个阶段的关键行为:
| 阶段 | 行为 | 常见考点 |
|---|---|---|
| ------ | ------ | --------- |
| FROM / JOIN | 确定数据源,执行JOIN | 笛卡尔积、数据膨胀(DAY 13) |
| WHERE | 行级过滤(此时还没有聚合值) | 不能用聚合函数(DAY 6) |
| GROUP BY | 分组 | 非聚合列必须在GROUP BY里(DAY 6) |
| HAVING | 组级过滤 | 可以用聚合函数(DAY 6) |
| SELECT | 计算返回列 | 窗口函数在这一步执行(DAY 18) |
| DISTINCT | 去重 | 在SELECT之后 |
| ORDER BY | 排序 | NULL排序位置(DAY 12) |
| LIMIT | 截取 | 最后执行 |
为什么窗口函数不能在WHERE里用?
-- ❌ 报错:窗口函数在SELECT阶段执行,WHERE在SELECT之前
SELECT *, ROW_NUMBER() OVER (ORDER BY cost DESC) AS rn
FROM ad_daily_cost
WHERE rn <= 3
-- ✅ 套一层子查询
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY cost DESC) AS rn
FROM ad_daily_cost
) t
WHERE rn <= 3
因为WHERE在SELECT之前执行,此时rn还不存在。这个知识点把DAY 1的TopN和DAY 6的执行顺序串起来了。
20天知识图谱
基础层:SQL语法和函数
| DAY | 主题 | 核心能力 | 关联知识 |
|---|---|---|---|
| ----- | ------ | --------- | --------- |
| 1 | 排名函数三兄弟 | ROW_NUMBER/RANK/DENSE_RANK | TopN取数 |
| 3 | 行转列与列转行 | CASE WHEN/EXPLODE | 报表开发 |
| 6 | GROUP BY陷阱 | SQL执行顺序、HAVING | 数据倾斜 |
| 12 | NULL的各种坑 | 三值逻辑、COALESCE | 数据质量 |
| 15 | 日期函数 | 各引擎差异、时区 | 出海业务 |
| 16 | UNION ALL vs UNION | 性能差异 | 列转行 |
进阶层:窗口函数和分析
| DAY | 主题 | 核心能力 | 关联知识 |
|---|---|---|---|
| ----- | ------ | --------- | --------- |
| 2 | 连续登录N天 | 日期-序号技巧 | 等差数列 |
| 4 | 用户留存率 | LEFT JOIN+业务理解 | 时区、分区裁剪 |
| 5 | 累计求和与滑动窗口 | ROWS BETWEEN/LAG | ROWS vs RANGE |
| 7 | 同比环比 | 多种时间对比口径 | 日历表补全 |
| 9 | 漏斗分析 | 有序漏斗、时间窗口 | 埋点数据 |
| 10 | RFM用户分层 | NTILE、综合应用 | 业务理解 |
| 18 | PARTITION BY vs GROUP BY | 窗口函数原理 | 占比计算 |
高阶层:优化和工程
| DAY | 主题 | 核心能力 | 关联知识 |
|---|---|---|---|
| ----- | ------ | --------- | --------- |
| 8 | 大表JOIN优化 | MapJoin、数据倾斜 | 加盐打散 |
| 11 | 子查询vs JOIN | EXISTS/NOT IN | NULL陷阱 |
| 13 | 多表JOIN执行顺序 | 执行计划、数据膨胀 | CBO |
| 14 | 分区表设计 | 分区裁剪 | 小文件问题 |
| 17 | 执行计划 | EXPLAIN、AQE | CBO vs RBO |
| 19 | CTE | 可读性、物化 | 调试技巧 |
面试答题框架
面试官问SQL题的时候,用这个框架回答,逻辑清晰、得分稳:
框架一:写SQL题
1. 确认需求和口径(留存是次日还是7日?漏斗要不要有序?)
2. 说清楚思路(先做什么,再做什么)
3. 写出基础版SQL
4. 主动优化(提NULL处理、分区裁剪、性能优化)
5. 讲实战经验(踩过什么坑、实际业务中怎么用的)
框架二:优化SQL题
1. 先看执行计划(EXPLAIN)
2. 检查分区裁剪是否生效
3. 检查JOIN策略(Broadcast or Shuffle)
4. 检查是否有数据倾斜
5. 考虑减少Shuffle次数
6. 考虑减少扫描数据量
框架三:设计题
1. 明确业务场景和数据量级
2. 选择分区策略
3. 选择存储格式(ORC/Parquet)
4. 考虑读写模式(OLAP or ETL)
5. 性能测试和调优
面试官最看重的5个能力
写了20天的SQL面试题,我总结面试官最看重的不是你能不能写出SQL,而是:
1. 业务理解能力
能把业务问题翻译成SQL逻辑。比如留存率的口径是什么、漏斗的有序性怎么定义、RFM的分档阈值怎么定。技术是工具,理解业务才是核心竞争力。
2. 代码质量意识
SQL不只要"能跑",还要"跑对""跑快""好维护"。用CTE而不是嵌套子查询、主动处理NULL、变量化日期参数——这些细节体现的是工程素养。
3. 性能优化意识
写完SQL先想想"这个在大数据量下会不会出问题"。分区裁剪、MapJoin、数据倾斜——不需要你记住所有细节,但要有这个思维框架。
4. 实战经验
面试官最爱听的是"我之前在XX项目中遇到过YY问题,用ZZ方法解决了,效果是AA"。所以每道题我都尽量结合了真实工作场景。
5. 表达能力
SQL思路清晰但说不清楚,面试官也无法给高分。练习的时候不只是写SQL,还要练习"边写边讲"——先说思路再写代码,写完再总结。
我的面试复习建议
作为一个正在准备冲大厂的过来人,说几条实在的建议:
1. 不要只刷题,要归类
SQL题看似千变万化,但核心就那么几类:排名/TopN、连续问题、聚合分组、JOIN优化、窗口函数。每一类吃透2-3道代表题,比刷100道散题有效。
2. 手写SQL
面试的时候没有IDE、没有自动补全、没有报错提示。平时练习要用记事本或白板写,确保你不依赖工具也能写对。
3. 准备2-3个项目案例
每个案例能串联多个知识点。比如"广告归因体系"可以串联JOIN优化、分区设计、时区处理、漏斗分析;"埋点治理"可以串联数据质量、GROUP BY去重、COUNT的NULL处理。
4. 说人话
面试不是学术报告。"这个用NTILE分五档"比"利用窗口函数NTILE实现基于分位数的等频分桶策略"好一百倍。
两季20道题的完整索引
第一季(DAY 1-10):
| DAY | 主题 | 难度 |
|---|---|---|
| ----- | ------ | ------ |
| 1 | ROW_NUMBER / RANK / DENSE_RANK | ⭐⭐ |
| 2 | 连续登录N天 | ⭐⭐⭐ |
| 3 | 行转列与列转行 | ⭐⭐ |
| 4 | 用户留存率 | ⭐⭐⭐ |
| 5 | 累计求和与滑动窗口 | ⭐⭐⭐ |
| 6 | GROUP BY陷阱与HAVING | ⭐⭐ |
| 7 | 同比环比全覆盖 | ⭐⭐⭐ |
| 8 | 大表JOIN优化 | ⭐⭐⭐⭐ |
| 9 | 漏斗分析 | ⭐⭐⭐⭐ |
| 10 | RFM用户分层 | ⭐⭐⭐⭐ |
第二季(DAY 11-20):
| DAY | 主题 | 难度 |
|---|---|---|
| ----- | ------ | ------ |
| 11 | 子查询 vs JOIN | ⭐⭐⭐ |
| 12 | NULL的各种坑 | ⭐⭐⭐ |
| 13 | 多表JOIN执行顺序 | ⭐⭐⭐ |
| 14 | 分区表设计与查询优化 | ⭐⭐⭐⭐ |
| 15 | 日期函数全家桶 | ⭐⭐ |
| 16 | UNION ALL vs UNION | ⭐⭐ |
| 17 | SQL执行计划怎么看 | ⭐⭐⭐⭐ |
| 18 | PARTITION BY vs GROUP BY | ⭐⭐⭐ |
| 19 | CTE的用法和性能 | ⭐⭐⭐ |
| 20 | 收官总结 | — |
下一步
SQL系列到这里告一段落,20道题覆盖了SQL面试95%以上的高频考点。
但大数据面试不只是SQL。接下来我计划开始Flink实时计算系列和数仓建模系列——这两个方向在中高级面试中权重越来越大,尤其是Flink,现在几乎是大数据面试的标配了。
如果这20天的SQL系列对你有帮助,帮我做三件事:
1. 点赞+收藏,方便以后复习
2. 评论区告诉我,你最希望我下一个系列先出Flink还是数仓
3. 转发给你身边在准备面试的朋友,好东西要分享
我是Wood,9年大数据老兵。咱们下个系列见。
关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长
感谢阅读
关注「Wood聊大数据」
9年大数据老兵,聊技术、聊职场、聊成长
小红书搜索「Wood聊大数据」
wooddata.com