第5章 越出单表:为什么拆表与四类 JOIN


第5章 · 越出单表:拆表、键与 JOIN

本章要回答的三个问题:当初为什么要把数据拆进七张表,而不是一张大宽表?INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN 四类连接各自保留哪些行、丢掉哪些行?自连接、多表链与连接条件写错位置,会制造哪些看起来合法、实际错得离谱的结果?学完本章,你能把散落多表的数据拼成一张正确的"宽表"。

为什么会有这一章

前四章的所有查询都困在一张表里,而现实的数据天生散落:书名在 books、分类名在 categories、买家在 customers、成交记录在 orders。想让查询越出单表,得先回答一个更根本的问题——数据为什么长成这个样子?答案叫规范化(范式):把重复出现的信息抽成独立的表,用键建立引用,消除"改一处要改一百处"的维护灾难。理解了拆表的理由,JOIN 就不再是需要死记的语法,而是"把拆开的世界拼回去"的自然动作。

本章的第三小节专门收集"结果合法但数据错误"的连接事故:重复计数、连接条件错位、外连接被 WHERE 条件悄悄废掉武功。这些坑的隐蔽性远高于语法错误——查询能跑、数字能看,就是不对。事故看多了,鉴别力自然就有了。

读完能解决什么

  • 用更新异常、插入异常解释"为什么不把分类名直接抄在 books 里",说出第一范式到第三范式的递进逻辑;
  • 读懂实体-联系图(ER 图),把"一个顾客有多个订单"这类业务描述翻译成外键方向;
  • 按业务语义在四类 JOIN 中选型:交集、保左、保右、保全,并能写出对应语句;
  • 写出三表以上的连接链与自连接(分类树、员工上级),并为每张表起清晰的别名;
  • 识别三大连接事故的表象与成因,用"先看基数再写连接"的流程预防。

各节怎么分工

节 回答哪个问题 关键产出
5.1 为什么拆表:范式与 ER 模型 数据为什么长这样 三大范式递进、ER 图读法、外键方向判断
5.2 四类 JOIN 一图选型 怎么拼回一张宽表 四类连接的行为对照、连接条件与别名规范
5.3 多表链、自连接与三个事故 链长了怎么不翻车 三表链、自连接、重复计数与外连接陷阱

先决条件

  • 第 1 章的主键概念(连接靠键完成,主外键是拼图的卡口);
  • 第 3 章的 NULL 判定(外连接产生的 NULL 是本章常客,IS NULL 判空是排错工具)。

本章知识点清单

  • 能对一个具体的"大宽表"指出它的更新异常与插入异常各发生在哪个字段;
  • 能说出"部分依赖"与"传递依赖"的区别,以及各由哪一级范式消除;
  • 能把 ER 图中的实体、属性、一对多联系对应到表、列、外键;
  • 能写出 INNER JOIN 与 LEFT JOIN 的最小示例,并说明右表中无匹配时各列显示什么;
  • 能推断四种 JOIN 对同一对表返回的行数相对大小关系;
  • 能写出三表连接链,说出"驱动表顺序影响可读性、优化器决定执行顺序";
  • 能用别名写出自连接,解释为什么自连接必须重命名表;
  • 能诊断"行数暴涨"(一对多连接导致的重复计数)并给出拆分或预聚合的解法;
  • 能解释"外连接 + 右表条件写在 WHERE"为何等效退化为内连接,正确位置是 ON。

本章概念全景:示例库的 ER 关系

拆是为了不重复,拼是为了能查询。范式决定怎么拆,JOIN 决定怎么拼——两件事是一枚硬币的正反面。

往下走到哪

JOIN 把宽表拼出来了,但有些问题的答案"藏在另一个查询的结果里":比平均价高的书有哪些、买过 A 又买过 B 的顾客是谁。把一个查询的结果喂给另一个查询,就是第 6 章的子查询与集合运算。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U