SQL面试题精选

2025年 阅读约 13 分钟 面试指南 · 数据库面试

精选SQL面试高频题目,涵盖查询优化、窗口函数、JOIN、子查询等核心知识点,附详细解答和实战案例。

一句话总结

SQL 是数据岗位的必考项,核心考点:JOIN(INNER/LEFT/RIGHT/FULL 区别)、窗口函数(ROW_NUMBER/RANK/DENSE_RANK/LEAD/LAG)、查询优化(索引+EXPLAIN)、经典题目(TopN/连续登录/行转列)。

JOIN查询

Q:各种JOIN的区别?

INNER JOIN:返回两表中匹配的行。

LEFT JOIN:返回左表所有行,右表无匹配则为NULL。

RIGHT JOIN:返回右表所有行,左表无匹配则为NULL。

FULL JOIN:返回两表所有行,无匹配则为NULL。

CROSS JOIN:笛卡尔积,返回两表所有组合。

面试技巧:能画出Venn图说明各种JOIN的关系,并给出实际业务场景。

窗口函数

Q:窗口函数有哪些?怎么用?

窗口函数在不减少行数的情况下进行聚合计算。

语法:函数名() OVER (PARTITION BY 列 ORDER BY 列 ROWS/RANGE ...)

常用窗口函数:
1. ROW_NUMBER():行号,不重复
2. RANK():排名,有并列跳号
3. DENSE_RANK():排名,有并列不跳号
4. LEAD/LAG:前/后N行的值
5. SUM/AVG OVER:累计/移动聚合

经典场景:部门薪资排名Top3、连续登录天数、同比环比计算。

查询优化

Q:SQL查询优化的方法?

索引优化:
1. 遵循最左前缀原则
2. 避免在索引列上使用函数或计算
3. 覆盖索引避免回表
4. 注意索引的选择性

查询优化:
1. 避免SELECT *
2. 小表驱动大表
3. 用EXISTS替代IN(大数据集)
4. 避免子查询,改用JOIN

EXPLAIN分析:关注type、key、rows、Extra字段。

经典SQL题目

1. 第二高薪水:使用LIMIT OFFSET或MAX子查询。

2. 连续登录天数:日期减去行号得到分组标识,再COUNT。

3. 部门工资Top3:DENSE_RANK窗口函数。

4. 求中位数:ROW_NUMBER排序后取中间行。

5. 行转列:CASE WHEN + 聚合函数,或PIVOT。

实战场景

场景:连续登录天数计算

-- 用户登录表 login_log(user_id, login_date) -- 求每个用户的最大连续登录天数 SELECT user_id, MAX(consecutive_days) AS max_days FROM ( SELECT user_id, grp, COUNT(*) AS consecutive_days FROM ( SELECT user_id, login_date, DATE_SUB(login_date, INTERVAL ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) DAY) AS grp FROM (SELECT DISTINCT user_id, login_date FROM login_log) t ) t2 GROUP BY user_id, grp ) t3 GROUP BY user_id; -- 关键思路:日期 - 行号 = 分组标识 -- 连续日期减去连续行号得到相同值,按此分组即可