0Pricing
SQL Interview Prep · 课时

连接三个或更多表

串联多个连接,并推理中间结果集

连接三个或更多表 是 CoddyKit 上的免费 SQL Interview Prep 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Interview Prep 课程共包含 4 节课。

连接是链式的,而不是分支式的

真实的面试题很少会停留在两张表。您可能会被要求连接三张、四张或更多表。能够化解这种复杂性的关键认识是:多表连接其实就是一连串的两表连接。

数据库会先将前两张表连接成中间结果,然后将该结果与第三张表连接,依此类推。如果您能够分析一个连接,就能够分析由多个连接组成的链。

三表架构

我们在这个示例中加入第三张表。现在我们有客户、他们的订单,以及每个订单所引用的产品。

  • customers(id, name)
  • orders(id, customer_id, product_id, amount)
  • products(id, title)

这三张表通过两种关系连接起来:orders.customer_id = customers.id 和 orders.product_id = products.id。

customers(id, name)
orders(id, customer_id, product_id, amount)
products(id, title)

基本的三表查询

将多个连接依次叠加。每个 JOIN ... ON 都会添加一张表,并说明它如何与前面已有的内容连接。

从上到下阅读:先从订单开始,连接匹配的客户,然后连接匹配的产品。每一行订单都会多出客户姓名和产品标题。

SELECT c.name, p.title, o.amount
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products  p ON p.id = o.product_id;

思考中间结果集

让多表连接变得容易的思维模型是:每次 JOIN 后,都想象一下当前的中间结果。

  • 第 1 次连接后:订单列 + 客户列。
  • 第 2 次连接后:上述结果 + 产品列。

下一个 ON 子句可以引用中间结果集中已经存在的任意列,因此连接顺序会影响您在每个 ON 中可以写出的内容。

每个 ON 都能引用之前的表

一个重要的结论是:后续连接的 ON 子句可以引用在它之前连接的任意表,而不仅是正在添加的表。

这里第三次连接关联到 o(订单),它已经在作用域内。您也可以把第四张表连接到 c 或 p,因为它们都已经属于当前结果。

SELECT c.name, p.title, w.region
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products  p ON p.id = o.product_id
JOIN warehouses w ON w.id = o.warehouse_id; -- refers to o

从 FROM 中的中心表开始

面试中的实用技巧是:在 FROM 中先写事实表 / 中心表(通常是位于关系中间的表),然后向外连接查找表。

订单表位于中间,持有指向客户和产品的外键,因此从这里开始可以让每个 ON 子句都保持简单,并且只引用前面已有的内容。

-- orders is central: it links to both sides
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products  p ON p.id = o.product_id

扇出会在连接链中累积

您学到的关于扇出的所有知识仍然适用,而且会层层叠加。如果每个订单有多个项目,而每个项目又有多条税费记录,行数会在每一步都成倍增长。

当多连接查询中的聚合结果看起来过大时,请怀疑某个中间连接引入了扇出,并逐一检查每个连接的粒度。

-- rows = orders * items_per_order * tax_rows_per_item
SELECT o.id
FROM orders o
JOIN order_items i ON i.order_id = o.id
JOIN item_taxes  t ON t.item_id  = i.id;

在连接链中混合连接类型

您可以在一条查询中混合使用 INNER 和 LEFT 连接,但顺序很重要。一旦 LEFT JOIN 引入了 NULL 值,后续引用这些 NULL 列的 INNER JOIN 可能会丢弃原本保留的行。

这里,如果某个客户没有订单,LEFT JOIN 会保留该客户,并将产品 ID 设为 NULL;随后与产品表的 INNER JOIN 又会把该客户移除。这是在压力下很容易犯的错误。

SELECT c.name, p.title
FROM customers c
LEFT JOIN orders  o ON o.customer_id = c.id
JOIN products p ON p.id = o.product_id;
-- the INNER products join can cancel the LEFT JOIN

让 OUTER JOIN 保持外连接

要让没有订单的客户一直保留到最后,请将下游连接也设置为LEFT。这样 NULL 值就能安全地传递到结果末端。

经验法则是:一旦使用外连接,对于从可选分支延伸出的每张表,都要继续使用外连接。

SELECT c.name, p.title
FROM customers c
LEFT JOIN orders   o ON o.customer_id = c.id
LEFT JOIN products p ON p.id = o.product_id;
-- customers with no orders are now kept (NULL title)

规模扩大后别名不可或缺

当有四五张表时,其中几张可能会共享 id、name 或 created_at 这样的列名。简短且一致的别名可以避免歧义,并让查询更易读。

请选择能够提示表名的别名(c、o、p),并为每一列加上限定表名。面试官会把您如何使用别名视为您编写生产环境 SQL 的能力体现。

SELECT c.id   AS customer_id,
       o.id   AS order_id,
       p.id   AS product_id,
       p.title
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products  p ON p.id = o.product_id;

多对多关系的桥接表

当两个实体之间存在多对多关系时,需要在它们之间放置第三张连接(桥接)表,并通过它进行连接。学生和课程通过选课记录表建立联系。

能够识别出必须通过桥接表进行关联,本身就是面试中常见的考察点。

SELECT s.name, c.title
FROM students s
JOIN enrollments e ON e.student_id = s.id
JOIN courses     c ON c.id = e.course_id;

快速检查

思考一条混合连接链。

回顾:连接三张或更多表

面试时请记住以下要点:

  • 多表连接是多个两表连接组成的链;请思考每一步之后的中间结果。
  • 后续的 ON 子句可以引用连接链中任何更早出现的表。
  • 从中心表开始,然后向外连接查找表。
  • 扇出会跨多个连接层层累积;请在每一步检查粒度。
  • LEFT JOIN 后的 INNER JOIN 可能会抵消它;要保留可选行,就继续使用 OUTER JOIN。
  • 多对多关系需要通过桥接表进行连接。

常见问题解答

「连接三个或更多表」课时是免费的吗?

是的 — 「连接三个或更多表」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 SQL Interview Prep 课程共包含 4 节课。

「连接三个或更多表」这节课中我会学到什么?

串联多个连接,并推理中间结果集 你通过在浏览器中直接运行的动手代码来练习 SQL Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Interview Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「连接三个或更多表」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Interview Prep 课中编写并运行代码吗?

能。每节 SQL Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. INNER JOIN 如何匹配行
  2. 连接中的 ON 与 WHERE
  3. 连接扩张与行数增加
  4. 连接三个或更多表
← 返回 SQL Interview Prep