第3章 SQL技术面试:高频SQL题型、窗口函数、查询优化、公司侧重点

SQL是BI分析师的核心技能,也是面试中的"硬门槛"。面试官通过SQL题考察候选人的数据思维、逻辑严谨性和工程实践能力。不同公司的考察侧重点有所不同:字节跳动侧重窗口函数与海量数据优化,阿里巴巴关注数据倾斜与复杂JOIN,腾讯偏好连续行为与留存分析,美团重视业务SQL与AB测试。本章围绕三大高频板块展开:窗口函数(最核心考点)、查询优化(必备技能)、经典题型(实战演练)。

📊 高频SQL题型与考察重点

题型分类典型问题核心考点难度
窗口函数ROW_NUMBER / RANK 区别排序逻辑、分组⭐⭐⭐
聚合查询GROUP BY + HAVING分组聚合、去重⭐⭐
连续行为连续登录N天窗口+日期差值⭐⭐⭐⭐
留存分析次日/7日留存自关联、窗口计算⭐⭐⭐⭐
查询优化慢SQL排查执行计划、索引⭐⭐⭐
数据倾斜Join倾斜处理数据分布、分桶⭐⭐⭐⭐⭐
🎯 理解需求 确认表结构与业务逻辑 🛠 选择方法 窗口/聚合/JOIN ✍️ 编写SQL 清晰语法 避免错误 ⚡ 优化验证 执行计划 索引检查 💡 扩展讨论 边界条件 性能考量 回答框架:理解需求 → 选择方法 → 编写SQL → 优化验证 → 扩展讨论

🎯 问答卡 1 · 窗口函数:ROW_NUMBER vs RANK vs DENSE_RANK

面试问题

请解释 ROW_NUMBER()、RANK() 和 DENSE_RANK() 的区别,并举例说明各自的使用场景。

面试官考察点
  • 对窗口函数底层排序逻辑的理解深度
  • 能否清晰区分三个函数的差异
  • 是否能在实际业务场景中正确选用
回答框架
  1. 定义区别:ROW_NUMBER 唯一连续编号;RANK 并列跳号;DENSE_RANK 并列不跳号
  2. 场景匹配:ROW_NUMBER 用于分页/去重;RANK 用于竞赛排名;DENSE_RANK 用于密集排名
  3. 案例说明:以成绩表 [90,90,80] 为例,三种函数输出分别为 [1,2,3]、[1,1,3]、[1,1,2]
简短示例回答

ROW_NUMBER() 为每行分配唯一编号,值相同也依次编号;RANK() 相同值排名相同但跳过后续排名号;DENSE_RANK() 相同值排名相同且不跳过。TopN 查询中常用 ROW_NUMBER() 实现每组取前 N 条,例如"每个部门工资最高的员工"。

可能追问
  • 如何用三种函数实现"每个部门工资前三"?哪种更合适?
  • 窗口函数中的 ORDER BY 默认排序方式是什么?NULL 值如何处理?