订阅更新

收官篇:一张图串起SQL面试所有知识点

SQL手册 第 20 题 约 11 分钟读完

本文目录
  1. SQL执行顺序:所有优化的基础
  2. 20天知识图谱
  3. 面试答题框架
  4. 面试官最看重的5个能力
  5. 我的面试复习建议
  6. 两季20道题的完整索引
  7. 下一步

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_RANKTopN取数
3行转列与列转行CASE WHEN/EXPLODE报表开发
6GROUP BY陷阱SQL执行顺序、HAVING数据倾斜
12NULL的各种坑三值逻辑、COALESCE数据质量
15日期函数各引擎差异、时区出海业务
16UNION ALL vs UNION性能差异列转行

进阶层:窗口函数和分析

DAY主题核心能力关联知识
-----------------------------
2连续登录N天日期-序号技巧等差数列
4用户留存率LEFT JOIN+业务理解时区、分区裁剪
5累计求和与滑动窗口ROWS BETWEEN/LAGROWS vs RANGE
7同比环比多种时间对比口径日历表补全
9漏斗分析有序漏斗、时间窗口埋点数据
10RFM用户分层NTILE、综合应用业务理解
18PARTITION BY vs GROUP BY窗口函数原理占比计算

高阶层:优化和工程

DAY主题核心能力关联知识
-----------------------------
8大表JOIN优化MapJoin、数据倾斜加盐打散
11子查询vs JOINEXISTS/NOT INNULL陷阱
13多表JOIN执行顺序执行计划、数据膨胀CBO
14分区表设计分区裁剪小文件问题
17执行计划EXPLAIN、AQECBO vs RBO
19CTE可读性、物化调试技巧

面试答题框架

面试官问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主题难度
-----------------
1ROW_NUMBER / RANK / DENSE_RANK⭐⭐
2连续登录N天⭐⭐⭐
3行转列与列转行⭐⭐
4用户留存率⭐⭐⭐
5累计求和与滑动窗口⭐⭐⭐
6GROUP BY陷阱与HAVING⭐⭐
7同比环比全覆盖⭐⭐⭐
8大表JOIN优化⭐⭐⭐⭐
9漏斗分析⭐⭐⭐⭐
10RFM用户分层⭐⭐⭐⭐

第二季(DAY 11-20):

DAY主题难度
-----------------
11子查询 vs JOIN⭐⭐⭐
12NULL的各种坑⭐⭐⭐
13多表JOIN执行顺序⭐⭐⭐
14分区表设计与查询优化⭐⭐⭐⭐
15日期函数全家桶⭐⭐
16UNION ALL vs UNION⭐⭐
17SQL执行计划怎么看⭐⭐⭐⭐
18PARTITION BY vs GROUP BY⭐⭐⭐
19CTE的用法和性能⭐⭐⭐
20收官总结—

下一步

SQL系列到这里告一段落,20道题覆盖了SQL面试95%以上的高频考点。

但大数据面试不只是SQL。接下来我计划开始Flink实时计算系列和数仓建模系列——这两个方向在中高级面试中权重越来越大,尤其是Flink,现在几乎是大数据面试的标配了。

如果这20天的SQL系列对你有帮助,帮我做三件事:

1. 点赞+收藏,方便以后复习

2. 评论区告诉我,你最希望我下一个系列先出Flink还是数仓

3. 转发给你身边在准备面试的朋友,好东西要分享

我是Wood,9年大数据老兵。咱们下个系列见。

关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长

感谢阅读

关注「Wood聊大数据」

9年大数据老兵,聊技术、聊职场、聊成长

小红书搜索「Wood聊大数据」

wooddata.com

刷题进度保存在当前浏览器