SQL作为数据库操作的核心语言,是后端开发、数据分析等岗位面试的必考内容,面试官通常会从基础语法到高级特性逐步深入考察求职者的掌握程度。
一、SQL基础查询类高频问题
基础查询是SQL面试的入门考点,最常考察的是SELECT语句的基础用法和过滤逻辑。
1. 如何查询表中重复的记录?
这类问题通常考察GROUP BY和HAVING的配合使用,核心思路是先按目标字段分组,再筛选出分组数量大于1的记录。
-- 查询user表中name重复的所有记录 SELECT name, COUNT(*) as repeat_count FROM user GROUP BY name HAVING COUNT(*) > 1;
2. 如何查询第N高的薪资?
这个问题考察排序和分页的使用,需要注意处理不存在第N高的情况,通常会结合DISTINCT去重和LIMIT偏移实现。
-- 查询员工表中第二高的薪资,不存在则返回null
SELECT IFNULL(
(SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1),
NULL
) as second_highest_salary;
二、多表关联类高频问题
多表关联是实际业务中最常用的操作,面试中常考察不同关联方式的区别和复杂关联场景的实现。
1. INNER JOIN、LEFT JOIN、RIGHT JOIN的区别是什么?
三者的核心差异在于对不匹配记录的处理逻辑,具体区别如下:
- INNER JOIN:只返回两个表中匹配关联条件的记录
- LEFT JOIN:返回左表所有记录,右表没有匹配则对应字段为NULL
- RIGHT JOIN:返回右表所有记录,左表没有匹配则对应字段为NULL
2. 如何查询没有下单的用户?
这类问题需要用到左连接结合NULL判断,先关联用户表和下单表,再筛选出下单表关联字段为空的记录。
-- 查询所有没有下单记录的用户信息 SELECT u.id, u.name FROM user u LEFT JOIN order o ON u.id = o.user_id WHERE o.user_id IS NULL;
三、索引与优化类高频问题
索引是提升查询性能的核心手段,面试中常考察索引的适用场景、失效情况和设计原则。
1. 什么情况下索引会失效?
常见的索引失效场景包括:
- 对索引字段使用函数或者运算操作,比如
WHERE YEAR(create_time) = 2023 - 使用
LIKE以通配符开头,比如WHERE name LIKE '%张三' - 查询条件中使用
OR且部分字段没有索引 - 字符串类型字段查询时没有加引号,导致隐式类型转换
2. 如何分析SQL查询性能?
可以通过EXPLAIN关键字查看SQL的执行计划,重点关注type、key、rows等字段,判断索引是否被正确使用。
-- 分析查询语句的执行计划 EXPLAIN SELECT * FROM user WHERE age > 18 AND city = '北京';
四、事务与高级特性类高频问题
事务和窗口函数是中高级岗位面试的常考内容,考察求职者对SQL高级特性的掌握程度。
1. 事务的ACID特性分别是什么?
ACID是事务的四个核心特性,具体含义如下:
| 特性 | 含义 |
|---|---|
| 原子性(Atomicity) | 事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间状态 |
| 一致性(Consistency) | 事务执行前后,数据库的完整性约束没有被破坏 |
| 隔离性(Isolation) | 多个事务并发执行时,一个事务的执行不会影响其他事务的执行 |
| 持久性(Durability) | 事务执行完成后,对数据的修改是永久性的,即使数据库故障也不会丢失 |
2. 窗口函数有什么作用?常见窗口函数有哪些?
窗口函数可以在不改变原表行数的情况下,对数据进行分组排序、计算聚合值,常见函数包括ROW_NUMBER()、RANK()、DENSE_RANK()等。
-- 查询每个部门薪资排名前三的员工
SELECT department, name, salary,
DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) as salary_rank
FROM employee
WHERE salary_rank <= 3;
五、面试备考建议
准备SQL面试时,建议先梳理基础语法,再针对性练习高频题型,同时结合实际业务场景理解知识点的应用场景。遇到复杂问题时,先拆解需求再逐步编写SQL,注意考虑边界情况的处理,比如空值、重复值等场景。