sql面试核心是理解数据关系与逻辑分步,高频考点为多表关联、窗口函数、分组聚合、去重排序、子查询嵌套;需掌握join陷阱、rank系函数区别、having与where分工、group_concat用法及游标分页优化。

SQL面试题核心不在于背语句,而在于理解数据关系、逻辑分步和边界情况处理。高频考点集中在多表关联、窗口函数、分组聚合、去重与排序、以及子查询嵌套这五大类。
多表JOIN的正确写法与陷阱
面试官常通过LEFT JOIN vs INNER JOIN、ON条件与WHERE条件混用、NULL值处理来考察基本功。
- LEFT JOIN后加WHERE过滤某右表字段,可能意外转成INNER JOIN效果——应把过滤条件写进ON里
- 多表连接时,明确主表(如订单表)和从表(用户、商品),避免笛卡尔积;建议先写ON再写WHERE
- 遇到“查所有用户及他们的最新一笔订单”,不能只用LEFT JOIN orders,得配合子查询或窗口函数取top 1
窗口函数是区分中高级候选人的关键
RANK() / ROW_NUMBER() / DENSE_RANK() 的区别必须能口头讲清,且能结合实际场景写出完整SQL。
- ROW_NUMBER():严格排序,相同值也给不同序号(适合取“每部门薪资第2高的人”)
- RANK():并列跳号(如95,95,87 → 1,1,3),适合榜单类需求
- 常用组合:PARTITION BY + ORDER BY + 聚合/排序函数;注意不能在WHERE或GROUP BY中直接引用窗口函数结果
GROUP BY的常见误用与扩展技巧
很多人能写SUM(CASE WHEN...)却说不清为什么HAVING比WHERE更适合筛分组后结果。
- HAVING作用于GROUP BY之后,可对聚合结果过滤(如HAVING COUNT(*) > 1);WHERE只能筛原始行
- SELECT中出现的非聚合字段,必须全部出现在GROUP BY中(MySQL宽松模式除外,但面试按标准SQL要求)
- 用GROUP_CONCAT(MySQL)或STRING_AGG(PostgreSQL)合并字符串,解决“查每个用户购买的所有商品名”类问题
去重、分页、TopN的稳定写法
别只写LIMIT 10 OFFSET 20——面试官会追问大数据量下如何优化分页,或“查每个类别销量前3的商品”怎么写。
- DISTINCT不是万能去重,重复逻辑复杂时优先用GROUP BY或ROW_NUMBER()去重
- 分页深翻性能差?可用“游标分页”:记录上一页最大ID,下一页WHERE id > last_id LIMIT 10
- TopN通用解法:用窗口函数按分类排序后外层筛选rn
真正拉开差距的,是能否快速识别题目背后的模型(比如“连续登录”本质是日期差+分组,“留存率”本质是多日用户交集)。练题时重点复盘思路卡点,而不是记答案。










