信息技术大学
SQL 基础
计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
信息技术大学
SQL 基础
计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)
SQL 逻辑执行顺序
写的顺序和执行的顺序不一样:FROM 先跑,SELECT 倒数第二,ORDER BY 收尾。
执行序
FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMIT
WHERE 与 HAVING
WHERE 分组前过滤行,HAVING 分组后过滤组
别名陷阱
SELECT 起的别名 WHERE 看不见,ORDER BY 才可见
JOIN 与子查询
JOIN 按键关联表,子查询套一层问:能 JOIN 就少嵌套,优化器更好下手。
INNER/LEFT
INNER 留交集;LEFT 保左表全量,缺则补 NULL
ON 与 WHERE
LEFT JOIN 的右表条件写 ON,写 WHERE 会退化成 INNER
子查询
大表场景 EXISTS 常优于 IN,相关子查询逐行执行
CTE
WITH 命名分步,复杂逻辑可读性大增
窗口函数
聚合不折叠行:窗口函数在保留明细的同时算排名、累计与组内统计。
排名三件
ROW_NUMBER 无并列,RANK/DENSE_RANK 处理并列
滑动聚合
SUM OVER 累计与移动平均,一行一算
分组明细
PARTITION BY 组内开窗,GROUP BY 给不了明细
建表三范式
范式管冗余:每列原子、依赖主键、无传递依赖——反范式是有意为之的取舍。
1NF
字段不可再拆,一行描述一个实体
2NF
非主属性完全依赖主键,消除部分依赖
3NF
消除传递依赖,非键属性之间互不依赖
反范式
为读性能有意冗余,代价是同步一致性
本节要点
- ✓执行序:FROM 在前,SELECT 倒数第二
- ✓LEFT JOIN 保左表,右表条件写 ON
- ✓窗口函数保留明细算聚合与排名
- ✓三范式除冗余,反范式换读性能
延伸主题:EXPLAIN 一条慢 JOIN用窗口函数写个 TopN
课后思考
先自己回答,再展开参考答案——能讲出来才算真懂。
1LEFT JOIN 加上右表条件的 WHERE,为什么结果变少了?
参考答案右表条件写在 ON 只影响匹配,未匹配仍保留 NULL 行;写进 WHERE 则在连接后过滤,NULL 判定为假,左表行也被剔除,LEFT 实际退化成 INNER。
2GROUP BY 已能分组聚合,为什么还要窗口函数?
参考答案GROUP BY 把每组折叠成一行,明细信息丢失;窗口函数逐行输出、在行上叠加组内统计,一张明细表同时回答「这一行是什么」和「它所在的组怎么样」。
3互联网公司建表常违反三范式,是错的吗?
参考答案不是错,是有意取舍:范式减少冗余保一致性,反范式用冗余换读性能、免大 JOIN。互联网读密集,冗余字段加异步同步是常见工程选择,前提是清楚一致性代价。