【前言】基础题能答,进阶题才见真章。窗口函数、索引、事务是面试官最爱深挖的三块,也是决定 offer 的分水岭。这篇把板块2的15道进阶必问整理成可背速查,附代码示例与易错点。
一、窗口函数(高频)
1、ROW_NUMBER / RANK / DENSE_RANK 区别:ROW_NUMBER 不并列;RANK 并列但跳号;DENSE_RANK 并列不跳号。示例:SELECT name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) FROM emp;
2、PARTITION BY 分组内排名:SELECT dept, name, RANK() OVER (PARTITION BY dept ORDER BY salary DESC) FROM emp;
3、SUM 累加 / 移动平均:SELECT id, amount, SUM(amount) OVER (ORDER BY id) FROM orders;
二、子查询与集合操作
4、子查询:SELECT name FROM emp WHERE salary > (SELECT AVG(salary) FROM emp);
5、EXISTS / NOT EXISTS:比 IN 更高效,命中即停。
6、UNION(去重)vs UNION ALL(不去重,更快)。
7、CASE WHEN:SELECT name, CASE WHEN salary>=10000 THEN 高薪 ELSE 普通 END FROM emp;
三、索引与查询优化
8、索引原理:B+ 树,类似目录,查询从 O(n) 降到 O(log n);代价是占空间、写变慢。
9、覆盖索引 / 最左前缀:联合索引 (a,b,c) 中 a、a+b、a+b+c 能命中,b、c、b+c 不能。
10、EXPLAIN:重点看 type(ALL=全表扫描 > index > range > ref > eq_ref > const)与 rows(扫描行数)。
11、慢查询优化框架:EXPLAIN 看是否全表扫描 → 加索引 → 避免 SELECT * → 避免 WHERE 对列做函数 → 深分页用游标。
四、事务与锁
12、事务 ACID:原子性、一致性、隔离性、持久性。
13、隔离级别:读未提交(脏读)/ 读已提交(不可重复读)/ 可重复读(幻读,MySQL默认)/ 串行化。
14、死锁:两事务互持对方资源。解决:超时回滚、合理加锁顺序、缩小事务范围。
15、锁:行锁、表锁、乐观锁(版本号)、悲观锁(SELECT...FOR UPDATE)。
【结语】板块2是进阶核心,板块3(真实场景题:连续登录、留存率、行列转换等)后续更新,关注不迷路。