SQL 基础

官官方信息技术老师·7 页·深入(追求细节与边界)·0 次浏览·33 天前
信息技术大学

SQL 基础

计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)

按 空格/→ 演示下一步

问一句
1 / 7 页

全部页面点击任意一页,跳回舞台从这页播放

信息技术大学

SQL 基础

计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)

1第 1 页 · SQL 基础

SQL 逻辑执行顺序

写的顺序和执行的顺序不一样:FROM 先跑,SELECT 倒数第二,ORDER BY 收尾。

执行序
FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMIT
WHERE 与 HAVING
WHERE 分组前过滤行,HAVING 分组后过滤组
别名陷阱
SELECT 起的别名 WHERE 看不见,ORDER BY 才可见
2第 2 页 · SQL 逻辑执行顺序

JOIN 与子查询

JOIN 按键关联表,子查询套一层问:能 JOIN 就少嵌套,优化器更好下手。

INNER/LEFT
INNER 留交集;LEFT 保左表全量,缺则补 NULL
ON 与 WHERE
LEFT JOIN 的右表条件写 ON,写 WHERE 会退化成 INNER
子查询
大表场景 EXISTS 常优于 IN,相关子查询逐行执行
CTE
WITH 命名分步,复杂逻辑可读性大增
3第 3 页 · JOIN 与子查询

窗口函数

聚合不折叠行:窗口函数在保留明细的同时算排名、累计与组内统计。

排名三件
ROW_NUMBER 无并列,RANK/DENSE_RANK 处理并列
滑动聚合
SUM OVER 累计与移动平均,一行一算
分组明细
PARTITION BY 组内开窗,GROUP BY 给不了明细
4第 4 页 · 窗口函数

建表三范式

范式管冗余:每列原子、依赖主键、无传递依赖——反范式是有意为之的取舍。

1NF
字段不可再拆,一行描述一个实体
2NF
非主属性完全依赖主键,消除部分依赖
3NF
消除传递依赖,非键属性之间互不依赖
反范式
为读性能有意冗余,代价是同步一致性
5第 5 页 · 建表三范式

本节要点

  • ✓执行序:FROM 在前,SELECT 倒数第二
  • ✓LEFT JOIN 保左表,右表条件写 ON
  • ✓窗口函数保留明细算聚合与排名
  • ✓三范式除冗余,反范式换读性能
延伸主题:EXPLAIN 一条慢 JOIN用窗口函数写个 TopN
6第 6 页 · 本节要点

课后思考

先自己回答,再展开参考答案——能讲出来才算真懂。

1LEFT JOIN 加上右表条件的 WHERE,为什么结果变少了?

参考答案右表条件写在 ON 只影响匹配,未匹配仍保留 NULL 行;写进 WHERE 则在连接后过滤,NULL 判定为假,左表行也被剔除,LEFT 实际退化成 INNER。

2GROUP BY 已能分组聚合,为什么还要窗口函数?

参考答案GROUP BY 把每组折叠成一行,明细信息丢失;窗口函数逐行输出、在行上叠加组内统计,一张明细表同时回答「这一行是什么」和「它所在的组怎么样」。

3互联网公司建表常违反三范式,是错的吗?

参考答案不是错,是有意取舍:范式减少冗余保一致性,反范式用冗余换读性能、免大 JOIN。互联网读密集,冗余字段加异步同步是常见工程选择,前提是清楚一致性代价。

7第 7 页 · 课后思考
SQL 基础 · 知识图解