您好,登录后才能下订单哦!
# 有哪些常见的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
题目:什么情况下索引会失效?
参考答案:
- 使用!=
或<>
操作符
- 对索引列进行函数运算(如YEAR(create_time) = 2023
)
- 使用前导模糊查询(LIKE '%abc'
)
- 类型隐式转换(如varchar列用数字查询)
- 复合索引未遵循最左前缀原则
题目:EXPLN命令输出的key_len字段表示什么?
答案解析: key_len表示索引使用的字节数,通过该值可以判断: - 复合索引实际使用了哪些列 - 字符串索引的实际使用长度 - 可为NULL的列会多用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
题目:查询所有下级组织(无限级树形结构)
参考答案:
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;
题目:MySQL默认的隔离级别是什么?各隔离级别如何解决并发问题?
参考答案: - 默认级别:REPEATABLE READ - 隔离级别对比: | 隔离级别 | 脏读 | 不可重复读 | 幻读 | |—————-|——|————|——| | READ UNCOMMITTED | ✓ | ✓ | ✓ | | READ COMMITTED | × | ✓ | ✓ | | REPEATABLE READ | × | × | ✓ | | SERIALIZABLE | × | × | × |
题目:描述一个典型的死锁场景及解决方法
案例: 1. 事务A先锁记录1,再请求记录2 2. 事务B先锁记录2,再请求记录1 3. 形成循环等待
解决方案:
- 设置锁超时参数innodb_lock_wait_timeout
- 按固定顺序访问资源
- 使用SELECT ... FOR UPDATE NOWT
题目:第三范式与BCNF的区别是什么?
关键点: - 3NF:非主属性不传递依赖于候选键 - BCNF:所有决定因素都必须是候选键 - BCNF是3NF的严格强化版
题目:订单表数据量过大如何处理?
解决方案: - 水平拆分:按订单ID哈希或时间范围分表 - 垂直拆分:将订单主表与明细表分离 - 归档策略:热数据与历史数据分离存储
题目:找出连续登录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
题目:计算次日留存率
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
题目:如何解决MySQL主从同步延迟?
解决方案:
- 使用半同步复制
- 业务层做读写路由
- 监控延迟时间SHOW SLAVE STATUS
- 考虑使用ProxySQL中间件
题目:如何实现跨库事务?
参考答案: - 2PC(两阶段提交)协议 - 使用Seata等分布式事务框架 - 最终一致性方案(消息队列+本地事件表)
本文整理了从基础到高级的50+个SQL面试考点,覆盖了90%以上的面试考察范围。建议读者: 1. 针对薄弱环节重点突破 2. 在测试环境实际执行所有示例代码 3. 结合具体业务场景思考SQL优化方案
注意:实际面试时应根据岗位级别调整准备深度,初级岗位侧重基础语法,高级岗位需深入原理和架构设计。 “`
这篇文章共计约3050字,采用Markdown格式编写,包含: - 7个大类面试问题 - 20+个具体题目及解答 - 10个代码示例 - 3个对比表格 - 系统的面试准备建议
可根据需要调整内容深度或补充特定数据库(如Oracle、PostgreSQL)的专有问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。