SQL 面试核心速记(面试前冲刺版)
一、必考基础语法(背熟)
| 关键字 | 作用 | 执行顺序 |
|---|---|---|
| SELECT | 查询字段 | 5 |
| FROM | 指定表 | 1 |
| WHERE | 行过滤(分组前) | 2 |
| GROUP BY | 分组聚合 | 3 |
| HAVING | 分组后过滤 | 4 |
| ORDER BY | 排序 | 6 |
| LIMIT | 限制行数 | 7 |
-- 执行顺序背熟:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
二、最常考的 4 种 JOIN(画图记)
INNER JOIN → 只返回匹配的(交集)
LEFT JOIN → 左表全部 + 右表匹配的(左独有+交集)
RIGHT JOIN → 右表全部 + 左表匹配的(右独有+交集)
FULL JOIN → 左右全部(并集)-- MySQL不支持,用UNION模拟
必记写法:
-- 左表独有(A - B)
SELECT * FROM A LEFT JOIN B ON A.id = B.id WHERE B.id IS NULL
三、窗口函数(必考,背模板)
ROW_NUMBER() -- 排名:1,2,3,4,5(不跳号,不并列)
RANK() -- 排名:1,2,2,4,5(跳号,并列)
DENSE_RANK() -- 排名:1,2,2,3,4(不跳号,并列)
模板:
SELECT *, ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段 DESC) AS rn
FROM 表
高频考题:查每个部门工资最高的员工
WITH ranked AS (
SELECT *, RANK() OVER(PARTITION BY dept_id ORDER BY salary DESC) AS rk
FROM employee
)
SELECT * FROM ranked WHERE rk = 1;
四、聚合函数 + GROUP BY 陷阱
COUNT(*) -- 所有行
COUNT(列) -- 非空行
COUNT(DISTINCT 列) -- 去重后非空行
⚠️ 常见错误:SELECT 中非聚合列必须出现在 GROUP BY 中
SELECT dept, AVG(salary) FROM emp GROUP BY dept; -- ✅
SELECT dept, name, AVG(salary) FROM emp GROUP BY dept; -- ❌ name 没分组
五、三大子查询
| 类型 | 关键字 | 特点 |
|---|---|---|
| 标量子查询 | = |
返回 1 行 1 列 |
| 行子查询 | IN |
返回 1 列多行 |
| 表子查询 | EXISTS |
返回多行多列 |
-- EXISTS(效率高,找到即停)
SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE B.id = A.id)
-- IN(先查子表,再匹配)
SELECT * FROM A WHERE id IN (SELECT id FROM B)
六、常用函数(背这几个就够了)
-- 字符串
CONCAT(a, b) -- 拼接
SUBSTRING(str, 1, 3) -- 截取
UPPER / LOWER -- 大小写
REPLACE(str, 'a', 'b') -- 替换
-- 日期
NOW() / GETDATE() -- 当前时间
DATE_FORMAT(date, '%Y-%m-%d') -- 格式化
DATEDIFF(d1, d2) -- 日期差
DATE_ADD(date, INTERVAL 1 DAY) -- 加天数
-- 条件判断(面试必问)
CASE WHEN 条件 THEN 值 ELSE 值 END
IFNULL(列, 默认值) -- MySQL
COALESCE(列, 默认值) -- 通用
七、三大范式(一句话背)
| 范式 | 核心要求 |
|---|---|
| 1NF | 列不可再分(原子性) |
| 2NF | 1NF + 所有列依赖于主键(消除部分依赖) |
| 3NF | 2NF + 没有传递依赖(A→B→C,则 C 应拆分) |
八、索引(面试高频)
-- 创建索引
CREATE INDEX idx_name ON table(column);
-- 复合索引(最左前缀原则)
-- 索引(a,b,c):能用到 a | a,b | a,b,c
-- 用不到:b | c | b,c
索引失效场景(背 3 个)
LIKE '%xxx'(前模糊)- 对列用函数:
WHERE YEAR(date) = 2025 - 隐式类型转换:
WHERE phone = 123(phone 是 varchar)
九、事务特性 ACID(倒背如流)
| 特性 | 含义 |
|---|---|
| Atomicity | 原子性——要么全成功,要么全回滚 |
| Consistency | 一致性——事务前后数据完整 |
| Isolation | 隔离性——事务间互不干扰 |
| Durability | 持久性——提交后永久生效 |
事务隔离级别(从低到高)
READ UNCOMMITTED → READ COMMITTED → REPEATABLE READ → SERIALIZABLE
(脏读) (不可重复读) (幻读) (串行化)
十、面试必问 3 道经典题
1. 删除重复数据
DELETE FROM t WHERE id NOT IN (
SELECT MIN(id) FROM t GROUP BY 重复列
);
2. 连续登录问题(用窗口函数)
WITH t1 AS (
SELECT user_id, login_date,
ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY login_date) AS rn
FROM login_log
)
SELECT user_id, MIN(login_date) AS start_date, MAX(login_date) AS end_date
FROM t1
GROUP BY user_id, DATE_SUB(login_date, INTERVAL rn DAY)
HAVING COUNT(*) >= 3; -- 连续3天
3. 行列转换
-- 行转列(PIVOT)
SELECT id,
MAX(CASE WHEN subject='语文' THEN score END) AS 语文,
MAX(CASE WHEN subject='数学' THEN score END) AS 数学
FROM scores GROUP BY id;
十一、MySQL vs Oracle 区别(面试加分)
| MySQL | Oracle |
|---|---|
LIMIT n |
ROWNUM <= n |
AUTO_INCREMENT |
SEQUENCE |
IFNULL() |
NVL() |
DATE_FORMAT() |
TO_DATE() |
最后提醒
面试时如果遇到不会的:
- 先说思路("我先用子查询找出...再用...")
- 问清楚场景("请问是查一条还是汇总统计?")
- 宁肯写伪代码也不要留空
祝明天面试顺利!🫡
浙公网安备 33010602011771号