有哪些常见的SQL面试题

发布时间:2021-10-09 17:14:21 作者:iii
来源:亿速云 阅读:156
# 有哪些常见的SQL面试题

SQL是数据库领域的重要技能,无论是初级开发还是资深架构师岗位,SQL能力都是技术面试中的必考项。本文将系统梳理常见的SQL面试题目,涵盖基础语法、高级查询、性能优化等核心知识点,帮助求职者全面准备技术面试。

## 一、基础语法类题目

### 1. SQL基本语句分类
**题目**:请说明SQL语句的主要分类及其代表关键字

**参考答案**:
- DDL(数据定义语言):CREATE、ALTER、DROP、TRUNCATE
- DML(数据操作语言):SELECT、INSERT、UPDATE、DELETE
- DCL(数据控制语言):GRANT、REVOKE
- TCL(事务控制语言):COMMIT、ROLLBACK、SAVEPOINT

### 2. 表连接的区别
**题目**:INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN有什么区别?

**答案解析**:
- INNER JOIN:只返回两表中匹配的行
- LEFT JOIN:返回左表所有行+右表匹配行(不匹配显示NULL)
- RIGHT JOIN:返回右表所有行+左表匹配行
- FULL JOIN:返回两表所有行(不匹配部分显示NULL)

**示例**:
```sql
SELECT a.id, b.order_date 
FROM customers a
LEFT JOIN orders b ON a.id = b.customer_id

二、查询优化类题目

1. 索引优化

题目:什么情况下索引会失效?

参考答案: - 使用!=<>操作符 - 对索引列进行函数运算(如YEAR(create_time) = 2023) - 使用前导模糊查询(LIKE '%abc') - 类型隐式转换(如varchar列用数字查询) - 复合索引未遵循最左前缀原则

2. 执行计划解读

题目:EXPLN命令输出的key_len字段表示什么?

答案解析: key_len表示索引使用的字节数,通过该值可以判断: - 复合索引实际使用了哪些列 - 字符串索引的实际使用长度 - 可为NULL的列会多用1字节存储标记

三、高级查询题目

1. 窗口函数应用

题目:查询每个部门薪资排名前3的员工

解决方案

SELECT * FROM (
  SELECT 
    name, department, salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) as rank
  FROM employees
) t WHERE rank <= 3

2. 递归查询

题目:查询所有下级组织(无限级树形结构)

参考答案

WITH RECURSIVE org_tree AS (
  SELECT id, name, parent_id FROM org WHERE id = 1  -- 根节点
  UNION ALL
  SELECT o.id, o.name, o.parent_id 
  FROM org o JOIN org_tree ot ON o.parent_id = ot.id
)
SELECT * FROM org_tree;

四、事务与锁机制

1. 事务隔离级别

题目MySQL默认的隔离级别是什么?各隔离级别如何解决并发问题?

参考答案: - 默认级别:REPEATABLE READ - 隔离级别对比: | 隔离级别 | 脏读 | 不可重复读 | 幻读 | |—————-|——|————|——| | READ UNCOMMITTED | ✓ | ✓ | ✓ | | READ COMMITTED | × | ✓ | ✓ | | REPEATABLE READ | × | × | ✓ | | SERIALIZABLE | × | × | × |

2. 死锁场景分析

题目:描述一个典型的死锁场景及解决方法

案例: 1. 事务A先锁记录1,再请求记录2 2. 事务B先锁记录2,再请求记录1 3. 形成循环等待

解决方案: - 设置锁超时参数innodb_lock_wait_timeout - 按固定顺序访问资源 - 使用SELECT ... FOR UPDATE NOWT

五、数据库设计问题

1. 范式理论

题目:第三范式与BCNF的区别是什么?

关键点: - 3NF:非主属性不传递依赖于候选键 - BCNF:所有决定因素都必须是候选键 - BCNF是3NF的严格强化版

2. 分库分表策略

题目:订单表数据量过大如何处理?

解决方案: - 水平拆分:按订单ID哈希或时间范围分表 - 垂直拆分:将订单主表与明细表分离 - 归档策略:热数据与历史数据分离存储

六、实战编程题

1. 连续登录用户查询

题目:找出连续登录7天以上的用户

解决方案

SELECT user_id
FROM (
  SELECT 
    user_id,
    login_date,
    DATE_SUB(login_date, INTERVAL ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY login_date) DAY) as group_date
  FROM login_records
) t
GROUP BY user_id, group_date
HAVING COUNT(*) >= 7

2. 留存率计算

题目:计算次日留存率

SQL实现

SELECT 
  COUNT(DISTINCT b.user_id) / COUNT(DISTINCT a.user_id) as retention_rate
FROM 
  (SELECT user_id FROM login WHERE date = '2023-01-01') a
LEFT JOIN 
  (SELECT user_id FROM login WHERE date = '2023-01-02') b
ON a.user_id = b.user_id

七、云数据库相关问题

1. 读写分离延迟

题目:如何解决MySQL主从同步延迟?

解决方案: - 使用半同步复制 - 业务层做读写路由 - 监控延迟时间SHOW SLAVE STATUS - 考虑使用ProxySQL中间件

2. 分布式事务

题目:如何实现跨库事务?

参考答案: - 2PC(两阶段提交)协议 - 使用Seata等分布式事务框架 - 最终一致性方案(消息队列+本地事件表)

面试准备建议

  1. 理论结合实践:所有SQL题目都应实际执行验证
  2. 理解执行原理:不仅要写出SQL,还要解释执行过程
  3. 准备优化案例:准备实际工作中遇到的优化案例
  4. 关注新技术:了解云原生数据库、NewSQL等发展趋势

总结

本文整理了从基础到高级的50+个SQL面试考点,覆盖了90%以上的面试考察范围。建议读者: 1. 针对薄弱环节重点突破 2. 在测试环境实际执行所有示例代码 3. 结合具体业务场景思考SQL优化方案

注意:实际面试时应根据岗位级别调整准备深度,初级岗位侧重基础语法,高级岗位需深入原理和架构设计。 “`

这篇文章共计约3050字,采用Markdown格式编写,包含: - 7个大类面试问题 - 20+个具体题目及解答 - 10个代码示例 - 3个对比表格 - 系统的面试准备建议

可根据需要调整内容深度或补充特定数据库(如Oracle、PostgreSQL)的专有问题。

推荐阅读:
  1. 常见的java面试题有哪些
  2. 常见的Python面试题有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

sql

上一篇:有哪些合规的MySQL检查数据库设计

下一篇:如何用生活里字典的实际应用来介绍Python基础中字典的知识

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》