后端面试必看:SQL高频面试题

5 阅读18分钟

对于后端开发面试来说,SQL是核心必考考点——无论是基础查询、多表关联,还是事务、索引、存储过程,都是面试官高频提问的内容。很多小伙伴备考时盲目刷题,记不住重点,答题时抓不住核心,尤其是手写SQL题容易踩坑,导致丢分。

本文结合近期后端面试真题,整理了SQL最常考的30道面试题,按「基础必背→高频查询→事务索引→进阶实操→综合简答」分类,每道题都附带简洁易懂的标准答案,手写SQL题标注核心思路,不啰嗦、不冗余,适合面试前直接背诵,帮你快速掌握考点,轻松应对面试提问。

核心提示:面试回答SQL问题,基础题简洁答清核心,手写SQL题注重逻辑严谨(避免语法错误、冗余查询),进阶题结合实际场景;文中标注「重中之重」的题目,是面试官必问,务必熟练掌握。

一、SQL基础概念(必考题,入门必背)

这类题目考察对SQL核心概念的掌握,难度较低,但属于必问内容,主要考察基础定义和核心区别,记准即可得分。

1. 请解释什么是SQL?SQL分为哪几类?

标准答案:SQL(Structured Query Language)即结构化查询语言,是用于访问和管理关系型数据库的标准语言,可实现数据查询、插入、修改、删除等操作。主要分为4类:① 数据查询语言(DQL):如SELECT;② 数据操作语言(DML):如INSERT、UPDATE、DELETE;③ 数据定义语言(DDL):如CREATE、DROP、ALTER;④ 数据控制语言(DCL):如GRANT、REVOKE。

2. 什么是关系型数据库?常见的关系型数据库有哪些?(重点)

标准答案:关系型数据库是基于关系模型(二维表格结构)的数据库,数据以行和列的形式存储,通过主键、外键建立表与表之间的关联,保证数据的完整性和一致性。常见的有:MySQL(后端最常用)、Oracle(企业级常用)、SQL Server、PostgreSQL。

3. 主键(Primary Key)和外键(Foreign Key)的区别是什么?

标准答案:核心区别的是作用和约束:① 主键:用于唯一标识表中的每一条记录,不能为NULL,一个表只能有一个主键(可联合主键);② 外键:用于关联两个表,建立表与表之间的关系,外键的值必须来自关联表的主键,可为空,一个表可以有多个外键,主要作用是保证数据的参照完整性。

4. 什么是NULL?NULL和空字符串('')的区别是什么?

标准答案:NULL表示“无值、未知”,不是任何具体的值;空字符串('')表示“有值,但值为空”。区别:① NULL不占用存储空间,空字符串占用存储空间;② 判断NULL用IS NULL/IS NOT NULL,判断空字符串用= ''/!= '';③ 聚合函数(如COUNT、SUM)会自动忽略NULL,不会忽略空字符串。

5. CHAR和VARCHAR的区别是什么?(重点)

标准答案:两者均用于存储字符串,核心区别在存储方式和适用场景:① CHAR:固定长度,即使存储的字符串不足指定长度,也会用空格填充,查询效率高,适合存储长度固定的数据(如手机号、身份证号);② VARCHAR:可变长度,存储的字符串长度随实际内容变化,节省存储空间,适合存储长度不固定的数据(如姓名、地址)。

二、SQL高频查询(面试必问,手写高频)

这类题目考察日常查询实操能力,面试官常让口述查询思路或手写SQL,重点掌握多表关联、聚合查询、排序分组,避免语法错误。

6. 说说你常用的SQL查询关键字及作用?(重点)

标准答案:按执行顺序和用途分类,逻辑清晰,面试官更青睐:

  • 基础查询:SELECT(指定查询字段)、FROM(指定查询表)、WHERE(过滤条件,排除不需要的数据);
  • 排序分组:ORDER BY(按指定字段排序,ASC升序、DESC降序)、GROUP BY(按指定字段分组)、HAVING(过滤分组后的结果,与WHERE区别:WHERE过滤行,HAVING过滤分组);
  • 多表关联:JOIN(内连接,只显示两表匹配的数据)、LEFT JOIN(左连接,显示左表所有数据,右表匹配不到显示NULL)、RIGHT JOIN(右连接,显示右表所有数据,左表匹配不到显示NULL);
  • 其他常用:DISTINCT(去重)、LIMIT(限制查询结果条数,分页常用)、COUNT(统计条数)、SUM(求和)、AVG(求平均值)。

7. 写出SQL分页查询语句(MySQL)?(重中之重)

标准答案:MySQL用LIMIT实现分页,核心语法(面试直接写):

-- 语法:LIMIT 偏移量, 每页条数(偏移量 = (页码-1)* 每页条数)
-- 示例:查询第2页,每页10条数据(表名:user)
SELECT * FROM user LIMIT 10, 10;
-- 简化写法(MySQL 8.0+):LIMIT 每页条数 OFFSET 偏移量
SELECT * FROM user LIMIT 10 OFFSET 10;

补充:Oracle用ROWNUM实现分页,面试若问,简单说明即可,重点掌握MySQL写法。

8. 如何查询表中重复的数据?并删除重复数据(保留一条)?(重点)

标准答案:以user表(重复字段:name)为例,核心SQL:

-- 1. 查询重复数据(显示重复的name和重复次数)
SELECT name, COUNT(name) AS count FROM user GROUP BY name HAVING COUNT(name) > 1;

-- 2. 删除重复数据(保留id最小的一条)
DELETE FROM user 
WHERE id NOT IN (SELECT MIN(id) FROM user GROUP BY name);

9. 内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)的区别?(重中之重)

标准答案:以表A(用户表)和表B(订单表)为例,简洁区分:

  • INNER JOIN:只返回两表中匹配(满足连接条件)的数据,不匹配的不显示;
  • LEFT JOIN:返回左表(A)所有数据,右表(B)匹配到的显示对应数据,匹配不到的显示NULL;
  • RIGHT JOIN:返回右表(B)所有数据,左表(A)匹配到的显示对应数据,匹配不到的显示NULL。

10. 写出SQL语句:查询用户表(user)中,年龄大于18,性别为男,按年龄降序排序,取前5条数据?

标准答案:语法严谨,无冗余,面试直接写:

SELECT * FROM user 
WHERE age > 18 AND gender = '男' 
ORDER BY age DESC 
LIMIT 5;

11. 什么是子查询?子查询和关联查询的区别?

标准答案:子查询(嵌套查询):将一个查询语句嵌套在另一个查询语句中,内层查询的结果作为外层查询的条件。区别:① 子查询逻辑简单,适合简单的条件过滤,但效率较低(内层查询执行完才执行外层);② 关联查询(JOIN)逻辑清晰,适合多表数据关联,效率高于子查询,是日常开发首选。

12. 如何使用SQL实现模糊查询?常用的通配符有哪些?

标准答案:用LIKE关键字实现模糊查询,常用通配符2个:① %:匹配任意长度的字符(包括0个);② _:匹配单个字符。示例:

-- 查询姓名中包含“张”的用户
SELECT * FROM user WHERE name LIKE '%张%';
-- 查询姓名第二个字是“三”的用户
SELECT * FROM user WHERE name LIKE '_三%';

三、事务与索引(Java后端超高频)

事务和索引是SQL面试的核心难点,考察对数据一致性和查询性能的理解,重点记事务ACID特性、索引分类及作用,是面试官必问的进阶考点。

13. 什么是事务?事务的ACID特性是什么?(重中之重)

标准答案:事务是一组不可分割的SQL操作集合,要么全部执行成功,要么全部执行失败,用于保证数据的一致性。ACID特性:

  • A(原子性):事务中的操作要么全部完成,要么全部回滚,不会出现部分执行的情况;
  • C(一致性):事务执行前后,数据的完整性约束(主键、外键等)保持不变;
  • I(隔离性):多个事务并发执行时,一个事务的操作不会影响另一个事务的执行;
  • D(持久性):事务执行成功后,数据会永久保存到数据库,即使数据库崩溃也不会丢失。

14. 事务的隔离级别有哪些?MySQL默认隔离级别是什么?(重点)

标准答案:从低到高4个隔离级别,解决并发事务的脏读、不可重复读、幻读问题:

  1. 读未提交(Read Uncommitted):最低级别,允许读取未提交的事务数据,会出现脏读;
  2. 读已提交(Read Committed):只能读取已提交的事务数据,解决脏读,会出现不可重复读;
  3. 可重复读(Repeatable Read):MySQL默认隔离级别,同一事务内多次读取同一数据结果一致,解决不可重复读,会出现幻读;
  4. 串行化(Serializable):最高级别,事务串行执行,避免所有并发问题,但效率最低,适合数据一致性要求极高的场景。

15. 什么是脏读、不可重复读、幻读?

标准答案:并发事务常见问题,简洁区分:

  • 脏读:读取到其他事务未提交的脏数据,后续该事务回滚,读取的数据无效;
  • 不可重复读:同一事务内,多次读取同一数据,结果不一致(被其他事务修改并提交);
  • 幻读:同一事务内,多次执行同一查询,返回的行数不一致(被其他事务插入或删除数据)。

16. 什么是索引?索引的作用是什么?(重点)

标准答案:索引是数据库中用于快速查询数据的数据结构(类似书籍的目录),建立在表的字段上。核心作用:① 提高查询效率,减少数据库扫描的数据量;② 加快排序、分组操作的速度;③ 保证数据的唯一性(如唯一索引)。

补充:索引不是越多越好,过多索引会降低插入、修改、删除的效率(维护索引需要消耗资源)。

17. 索引分为哪几类?MySQL常用的索引是什么?

标准答案:按功能分类,核心4类:

  • 主键索引(Primary Key):唯一标识表中记录,自动建立,不能为NULL,一个表只能有一个;
  • 唯一索引(Unique):保证字段值唯一,允许为NULL,一个表可以有多个;
  • 普通索引(Index):最常用,无唯一性约束,仅用于提高查询效率;
  • 联合索引(Composite Index):基于多个字段建立的索引,遵循“最左前缀原则”(查询时需匹配最左边的字段才能生效)。

MySQL常用索引:InnoDB引擎默认使用B+树索引(主流、效率高),MyISAM引擎使用B树索引。

18. 什么情况下索引会失效?(重点)

标准答案:常见5种失效场景,面试重点记:

  • 查询条件中使用函数(如SUBSTR、DATE_FORMAT)或运算(如age+1=20);
  • 使用LIKE以%开头(如LIKE '%张'),以%结尾或中间包含%不失效;
  • 查询条件中使用OR,且OR两边的字段未全部建立索引;
  • 数据类型不匹配(如字段是int,查询时用字符串匹配);
  • 联合索引不遵循最左前缀原则(如联合索引(name, age),查询时只用到age字段)。

四、SQL进阶实操(手写高频,难点)

这类题目是面试难点,主要考察复杂查询、数据操作、存储过程等实操能力,重点掌握核心思路,手写时避免语法错误。

19. 写出SQL语句:关联用户表(user)和订单表(order),查询每个用户的姓名、订单数量,没有订单的用户显示0?(重点)

标准答案:用左连接+聚合函数,核心SQL(面试直接写):

SELECT u.name, IFNULL(COUNT(o.id), 0) AS order_count
FROM user u
LEFT JOIN `order` o ON u.id = o.user_id
GROUP BY u.id, u.name;

补充:IFNULL函数用于将NULL替换为0,避免没有订单的用户显示NULL。

20. 如何修改表结构?(添加字段、修改字段、删除字段)

标准答案:用ALTER TABLE语句,核心示例(表名:user):

-- 1. 添加字段(添加phone字段,varchar类型,非空)
ALTER TABLE user ADD COLUMN phone VARCHAR(11) NOT NULL;

-- 2. 修改字段(将phone字段长度改为13)
ALTER TABLE user MODIFY COLUMN phone VARCHAR(13) NOT NULL;

-- 3. 删除字段(删除phone字段)
ALTER TABLE user DROP COLUMN phone;

21. 什么是存储过程?如何调用存储过程?(重点)

标准答案:存储过程是一组预编译的SQL语句集合,封装成一个可调用的程序,创建一次可多次调用,能提高代码复用性和执行效率,适合复杂的SQL操作。调用存储过程的核心命令:SQL标准中用CALL语句,部分数据库(如SQL Server)可用EXEC语句,示例:

-- 1. 创建存储过程(查询指定用户的订单数量)
DELIMITER //
CREATE PROCEDURE get_order_count(IN user_id INT, OUT count INT)
BEGIN
    SELECT COUNT(id) INTO count FROM `order` WHERE user_id = user_id;
END //
DELIMITER ;

-- 2. 调用存储过程(SQL标准调用方式)
CALL get_order_count(1, @count);
-- 查看结果
SELECT @count;

22. 什么是触发器?触发器的作用是什么?

标准答案:触发器是一种特殊的存储过程,无需手动调用,而是通过指定事件(如INSERT、UPDATE、DELETE)触发执行。核心作用:① 强化数据约束,维护数据的完整性和一致性;② 跟踪数据库操作,禁止未经许可的更新和修改;③ 实现联级运算(如一个表的操作触发另一个表的触发器)。

23. 写出SQL语句:删除用户表(user)中年龄小于18的用户,同时删除该用户对应的所有订单?

标准答案:用DELETE + 子查询,或触发器,推荐子查询(简洁易懂):

-- 1. 先删除订单表中对应的订单
DELETE FROM `order` WHERE user_id IN (SELECT id FROM user WHERE age < 18);
-- 2. 再删除用户表中符合条件的用户
DELETE FROM user WHERE age < 18;

24. 如何查询表中第N高的薪水?(高频手写题)

标准答案:用DISTINCT去重 + LIMIT,核心SQL(表名:salary,字段:salary):

-- 查询第3高的薪水,没有则返回NULL
SELECT IFNULL(
    (SELECT DISTINCT salary FROM salary ORDER BY salary DESC LIMIT 2, 1),
    NULL
) AS third_highest_salary;

思路:先去重(避免薪水重复),按降序排序,LIMIT偏移量设为N-1,取1条数据。

五、SQL优化(后端面试重中之重)

SQL优化是面试压轴考点,考察实际工作能力,面试官会问“如何优化慢查询”,重点掌握核心优化技巧,结合实际场景回答。

25. 如何优化SQL查询性能?(重点)

标准答案:核心5个优化技巧,结合实操,面试官最关注:

  1. 建立合适的索引:在查询频繁的字段(WHERE、JOIN、ORDER BY后的字段)建立索引,避免索引失效场景;
  2. 优化查询语句:避免SELECT *(只查需要的字段)、避免子查询(用JOIN替代)、避免OR(用IN替代);
  3. 优化表结构:合理选择字段类型(如手机号用CHAR(11),不用VARCHAR)、避免NULL(用默认值替代)、拆分大表(将高频查询和低频查询的字段拆分);
  4. 优化分页查询:避免大偏移量(如LIMIT 10000, 10,可用主键过滤优化);
  5. 定期维护数据库:清理冗余数据、优化表碎片、分析慢查询日志(explain命令)。

26. explain命令的作用是什么?核心字段有哪些?

标准答案:explain命令用于分析SQL语句的执行计划,查看查询是否使用索引、扫描行数、执行顺序等,从而定位慢查询的原因,是SQL优化的核心工具。核心字段:

  • type:表示查询类型,从好到差依次是:system > const > eq_ref > ref > range > ALL(ALL表示全表扫描,效率最低);
  • key:表示实际使用的索引,NULL表示未使用索引;
  • rows:表示查询扫描的行数,行数越少,效率越高;
  • Extra:额外信息,如Using index(使用覆盖索引,效率高)、Using filesort(文件排序,效率低)。

27. 什么是覆盖索引?有什么作用?

标准答案:覆盖索引是指索引中包含了查询所需的所有字段,无需回表查询(不用再去主键索引中获取其他字段数据)。作用:减少数据库IO操作,大幅提高查询效率,是SQL优化的常用技巧。

示例:查询用户姓名和年龄,若建立联合索引(name, age),则查询时直接从索引中获取数据,无需回表。

六、综合简答 & 压轴高频题(面试加分项)

这类题目考察综合能力和实际工作经验,回答时结合日常开发场景,逻辑清晰,能体现你的实操能力,是面试加分项。

28. 日常开发中,你用SQL主要做什么?(重点)

标准答案:结合后端开发场景,真实回答即可,体现实用性:

  • 基础数据操作:编写查询、插入、修改、删除语句,满足业务需求;
  • 多表关联查询:关联用户、订单、商品等多张表,获取复杂业务数据;
  • 数据统计分析:用聚合函数、分组排序,统计业务指标(如订单量、销售额);
  • SQL优化:分析慢查询,建立索引、优化查询语句,提升系统性能;
  • 数据库维护:创建表、修改表结构、编写存储过程、触发器,维护数据完整性。

29. MySQL和Oracle的核心区别是什么?

标准答案:核心4点区别,简洁不啰嗦:

  • 开源性:MySQL开源免费,Oracle闭源收费,企业级部署成本高;
  • 性能:MySQL适合中小规模应用,轻量高效;Oracle适合大型企业级应用,支持高并发、大数据量;
  • 语法差异:分页(MySQL用LIMIT,Oracle用ROWNUM)、函数(如字符串函数、日期函数)略有不同;
  • 事务隔离:MySQL默认可重复读,Oracle默认读已提交。

30. 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?

标准答案:优先选择约束,其次用触发器,最后考虑自写业务逻辑,原因如下:

  • 优先用约束(如主键、外键、非空、唯一约束):效率最高、配置简单,能直接保证数据基础完整性;
  • 其次用触发器:能保证无论什么业务系统访问数据库,都能维护数据的完整性和一致性,无需在每个业务逻辑中重复编写校验代码;
  • 最后考虑自写业务逻辑:编码复杂、效率低,且容易出现遗漏,仅在约束和触发器无法满足需求时使用。

面试备考小技巧(必看)

  • 背诵重点:标注「重点」「重中之重」的题目,是面试官必问,优先背诵,尤其是事务ACID、索引、SQL优化;
  • 手写练习:每天练3-5道手写SQL题(分页、多表关联、去重、统计),避免语法错误,重点练左连接、聚合查询;
  • 答题技巧:回答SQL优化、事务等题目时,结合实际场景(如“项目中遇到慢查询,我用explain分析,发现是全表扫描,添加索引后性能提升”);
  • 避坑提醒:手写SQL时,表名、字段名若有关键字(如order、user),记得用反引号``包裹;避免SELECT *,避免索引失效场景;
  • 考前冲刺:面试前10分钟,重点过一遍「精简背诵版」(下文),快速唤醒记忆。

考前10分钟精简背诵版(一句话答案)

适合考前快速过一遍,强化记忆,避免遗忘核心考点:

  1. SQL分类:DQL(查)、DML(增删改)、DDL(建删改表)、DCL(权限);
  2. 主键唯一非空,外键关联表,保证参照完整性;
  3. CHAR固定长度(查快),VARCHAR可变长度(省空间);
  4. 分页SQL:LIMIT 偏移量, 每页条数(偏移量=(页码-1)*每页条数);
  5. 事务ACID:原子性、一致性、隔离性、持久性;MySQL默认隔离级别可重复读;
  6. 索引:B+树为主,提高查询效率,避免5种失效场景;
  7. 左连接:左表全显,右表匹配不到显NULL;内连接只显匹配数据;
  8. SQL优化:建索引、避SELECT *、优化慢查询、拆分大表;
  9. 存储过程预编译可复用,SQL标准用CALL调用;触发器由事件触发,维护数据一致性;
  10. explain分析执行计划,type字段看查询效率,key字段看是否用索引。

总结

SQL面试考察的核心是「实操性」和「逻辑性」,面试官不关注你是否掌握复杂的底层原理,重点关注你是否能熟练编写SQL语句、理解事务和索引、优化慢查询,以及解决实际业务中的数据问题。

本文整理的30道面试题,涵盖了后端面试中所有SQL高频考点,按分类整理,标准答案简洁易背,手写SQL题标注核心思路,适合面试前集中背诵和练习。建议结合实际项目场景,多动手写SQL、分析慢查询,面试时从容应答,轻松拿下SQL考点,为面试加分!