跳至主要内容

如何在 SQL 中连接 3 个表:方法与示例

学习如何高效地在 SQL 中连接三个表。了解实用方法与示例,提升您的数据处理能力,轻松掌握 SQL 连接。
· 7分钟 阅读

使用 AI 探索

虽然 SQL 连接通常用于合并两个表的数据,但完全不必止步于此。实际上,您可以将三个甚至更多表的数据合并起来,从而从数据中发掘更复杂的关系与洞见。

在本文中,我将通过示例带您完成在 SQL 中连接三个表的过程;我们也会讨论特定数据库的实现与最佳实践。我还强烈建议您学习我们的 Introduction to SQL 和 Learn SQL 课程,夯实关键基础知识。

要点速览

  • 当您只需要所有表之间均匹配的记录时,使用 INNER JOIN;当您希望保留主表中的所有记录(即使没有匹配)时,用 LEFT JOIN;若以最右侧表为优先,则用 RIGHT JOIN。

  • SQL 按从左到右的顺序处理连接,因此顺序很重要。请逐步构建查询,并边写边检查结果。

  • 为获得更佳性能,请为连接列创建索引,使用 WHERE 提前过滤,优先连接较小的表,并仅选择所需列。

在 SQL 中连接 3 个表的步骤

在 SQL 中连接三个表可以跨多表执行复杂查询。当连接三个表时,我们使用 JOIN 子句来合并这些表中的数据。

假设您有以下三个表:Customers、Products 和 Orders。

SQL 中 Customers 表示例。

SQL 中 Customers 表示例。图片来源:作者。

SQL 中 Products 表示例。

SQL 中 Products 表示例。图片来源:作者。

SQL 中 Orders 表示例。

SQL 中 Orders 表示例。图片来源:作者。

首先,您可以连接 Customers 和 Orders 表,以展示哪些客户下了订单及其订单详情,例如 order_id、order_date 和订购的 quantity。

-- Select data from Customers
SELECT 
    Customers.customer_id, 
    Customers.first_name, 
    Customers.last_name, 
    Orders.order_id, 
    Orders.order_date, 
    Orders.quantity 
FROM Customers
-- Join Orders table
INNER JOIN Orders 
ON Customers.customer_id = Orders.customer_id;

SQL 连接 Customers 与 Orders 表示例。

SQL 连接 Customers 与 Orders 表示例。图片来源:作者。

最后,您可以将 Customers、Orders 和 Products 三个表合并,以获取客户、其订单、所购产品以及每个订单总成本的全景视图。

-- Select data starting with Customers
SELECT 
    Customers.customer_id,
    Customers.first_name,
    Customers.last_name,
    Orders.order_id,
    Orders.order_date,
    Products.product_name,
    Orders.quantity,
    Products.price,
    (Orders.quantity * Products.price) AS total_cost -- Total cost calculation
FROM Customers
-- Join the Orders table based on customer_id
INNER JOIN Orders 
ON Customers.customer_id = Orders.customer_id
-- Join the Products table based on product_id
INNER JOIN Products 
ON Orders.product_id = Products.product_id;

SQL 连接三个表示例。

SQL 连接三个表示例。图片来源:作者。

下面我们来看使用 INNER JOIN、LEFT JOIN 和 RIGHT JOIN 连接三个表的实际示例。查阅我们的 Introduction to SQL Joins 教程,了解更多连接类型与示例。

在 SQL 中连接 3 个表的示例

现在我们通过一些实际示例来演示如何使用 INNER JOIN、LEFT JOIN 和 RIGHT JOIN 连接三个表。

如果您对这些连接的含义一时拿不准,并希望进一步练习以真正掌握正确技巧,欢迎报名我们的 Joining Data in SQL 课程,它不仅会帮助您掌握 SQL 连接,还会讲解关系集合论与子查询。

使用 INNER JOIN

INNER JOIN 会检索在三个表中都有匹配值的记录,过滤掉任何不匹配的记录。当您只需要所有相关表中存在直接关联的结果时,INNER JOIN 是理想选择。

假设有三个表:Customers、Orders 和 Products。下面的查询仅检索已下单的客户,并包含与每个订单相关的产品详情。

-- Select customer details, order information, and associated product names
SELECT 
    Customers.customer_id, 
    Customers.customer_name, 
    Orders.order_id, 
    Products.product_name 
-- Select from Customers table
FROM Customers
    -- Join Orders table
    INNER JOIN Orders 
        ON Customers.customer_id = Orders.customer_id
    -- Join Products table
    INNER JOIN Products 
        ON Orders.product_id = Products.product_id;

使用 LEFT JOIN

LEFT JOIN 返回第一个(左侧)表中的所有记录,以及来自其他两个表的匹配记录;如果没有匹配,右侧表的列会返回 NULL。当需要从主表中检索所有记录,即使有些行在其他表中没有关联数据时,LEFT JOIN 非常有用。

在下面的示例中,所有客户都会出现在结果中,即使他们尚未下单。若没有匹配的订单或产品数据,相应数据字段会返回 NULL 值。

-- Select customer details, order information, and product names
SELECT 
    Customers.customer_id, 
    Customers.customer_name,
    Orders.order_id, 
    Products.product_name
FROM Customers
    -- Join Orders table
    LEFT JOIN Orders 
        ON Customers.customer_id = Orders.customer_id
    -- Join Products table
    LEFT JOIN Products 
        ON Orders.product_id = Products.product_id;

需要说明的是,在 SQL 中 LEFT JOIN 与 LEFT OUTER JOIN 含义相同。我们有一篇详细教程:SQL LEFT JOIN vs. LEFT OUTER JOIN。

使用 RIGHT JOIN

RIGHT JOIN 会检索第三个(最右侧)表中的所有记录,以及来自左侧表的匹配记录。尽管 RIGHT JOIN 较少使用,但当您需要优先考虑最右侧表中的记录时,它依然很有帮助。

例如,在进行库存分析时,您可能想了解哪些产品有订单或客户交互。下面的查询会列出所有产品,并包含相关的订单或客户数据。如果某些产品尚未被订购,order_id 和 customer_name 字段将显示 NULL。

-- Select customer details, order information, and product names
SELECT 
    Customers.customer_id,
    Customers.customer_name,
    Orders.order_id,
    Products.product_name
 -- Select from Customers table
FROM Customers
 -- Join Orders table
    RIGHT JOIN Orders 
        ON Customers.customer_id = Orders.customer_id
 -- Join Products table
    RIGHT JOIN Products 
        ON Orders.product_id = Products.product_id;

尽管上面的示例分别演示了单一类型的连接(INNER JOIN、LEFT JOIN 或 RIGHT JOIN),但在同一个查询中组合不同的连接类型以处理更复杂的数据关系完全可行——而且往往是必要的。比如,您可以在同一查询中对一段关系使用 LEFT JOIN 以包含某表的所有记录,同时对另一段关系使用 INNER JOIN。

此外,还需要说明的是,SQL 会按从左到右的顺序依次处理连接,因此连接的先后顺序决定了表如何合并以及如何处理 NULL 值。这也是我在本文开头以“两步走”的过程来展示的原因。按步骤构建查询并逐步验证结果,是正确的方法。LEFT JOIN 后接 INNER JOIN 往往与 INNER JOIN 后接 LEFT JOIN 的结果不同。

为什么需要在 SQL 中连接 3 个表

我们不妨先谈谈数据库设计。如今经常需要跨两个以上的表进行连接,其原因在于数据库规范化已非常普遍。数据库(更准确地说,是设计数据库的人)通过将信息组织到彼此关联的不同表中来实现这一点,这样做的目的之一是消除冗余(还有其他原因)。这种数据库分解意味着与不同实体相关的数据——例如我们上文看到的 Customers、Orders 和 Products 表——会被分别存储。

换言之,由于数据常常存储在规范化的数据库模式中,检索信息通常需要合并来自多个表的数据。因此,我们应当掌握如何编写包含大量连接的查询,简单来说,这就是数据最可能的组织方式。关于这些理念,我们的 Database Design 课程是一个不错的资源。

特定数据库的连接特性

虽然大多数关系型数据库中的 SQL 连接相对一致,但在处理涉及三个或更多表的多重连接时,仍存在一些差异。让我们看看各数据库的特定实现与注意事项,以避免陷阱并进行优化。

MySQL

MySQL 通常能很好地处理基础连接,但在涉及多表的复杂查询上可能会遇到困难。MySQL 的 EXPLAIN 命令有助于理解连接性能,并通过索引或重写查询来寻找优化方式。MySQL 还支持 STRAIGHT_JOIN 关键字,可强制连接顺序,在默认优化不理想时可能提升性能。

PostgreSQL

PostgreSQL 拥有强大的优化器,即便在大型数据集上也能高效处理复杂连接。其对 WITH RECURSIVE 子句的支持,使得可在多表间连接层级数据。PostgreSQL 的 窗口函数 功能强大,可与连接配合使用,在合并后的数据集中进行逐行分析。

SQL Server

SQL Server 允许使用特定的连接提示(MERGE JOIN、LOOP JOIN 和 HASH JOIN)来覆盖默认行为,从而提升多表连接性能。SQL Server 中的 CROSS APPLY 和 OUTER APPLY 运算符是连接表与表值函数的强大工具,为多表查询提供更高的灵活性。

我建议学习 DataCamp 的 Introduction to SQL Server 课程,以了解 SQL Server 在数据查询方面的不同功能。您也可以学习我们的 SQL Server Fundamentals 技能路径,以提升连接表与数据分析的能力。SQL Server Developer 职业路径将帮助您在 SQL Server 中编写、排错并优化查询。

Oracle SQL

Oracle 支持所有标准连接,并提供如 NATURAL JOIN 等独特选项,可基于匹配的列名自动连接表。Oracle 对使用 CONNECT BY 的层级查询提供支持,有时可通过更高效地处理嵌套数据来减少额外连接的需求。

在 SQL 中连接 3 个表的最佳实践

在 SQL 中连接三个表会增加查询复杂度并影响性能,尤其是在数据量增长时。以下是提升查询性能的最佳实践与优化技巧。

  • 使用合适的索引: 为经常用于连接条件的列创建索引,可通过减少扫描的数据量来加速数据检索。

  • 在 WHERE 与 JOIN 条件中尽早过滤: 将过滤条件直接放在 JOIN 或 WHERE 子句中,以减少后续连接需要处理的数据量,从而提升性能。

  • 考虑连接顺序与类型: 在进行多表连接时,优先连接较小的表,以尽快缩小数据集范围。若分析不需要未匹配记录,尽量避免使用 LEFT 或 RIGHT 连接。

  • 用 SELECT 精简返回列: 避免使用 SELECT * 将不必要的列包含进来。明确选择所需列,以减少每个表返回的数据,降低内存占用并提升查询性能。

  • 对复杂连接使用子查询或临时表: 对非常复杂的连接,可考虑使用子查询将查询拆解为更小的部分。对于涉及重复复杂查询的连接,考虑将中间结果存入临时表,以节省处理时间,尤其适用于需要大量计算的查询。

结语与进阶学习

在 SQL 中连接三个表可以跨多表整合数据,服务于全面的数据分析与数据库管理。掌握正确技巧将确保您的代码高效、可扩展且性能优异。

如果您希望成为一名熟练的数据分析师,建议查看我们的 Associate Data Analyst in SQL 职业路径,学习必要技能。若您希望学习如何用 SQL 构建专业仪表板,Reporting in SQL 课程同样适合。最后,我建议获取 SQL Associate Certification 认证,以证明您在使用 SQL 进行数据分析方面的能力,并让您的简历更具竞争力。

Allan Ouko

作者

Allan Ouko

数据科学技术写作者,具备数据分析、商业智能和数据科学的一线实践经验。我撰写以行业为导向的实用内容,涵盖 SQL、Python、Power BI、Databricks 和数据工程,并以真实的分析工作为基础。我的写作兼顾技术深度与业务影响,帮助专业人士将数据转化为自信的决策。

常见问题

连接三个表可以使用哪些类型的连接?

您可以使用 INNER JOIN、LEFT JOIN、RIGHT JOIN,有时也可使用 FULL JOIN 来合并三个表。

在连接三个表时,连接顺序重要吗?

连接顺序会影响性能,尤其是在大表情况下。从较小或过滤性强的表开始通常更高效。

在 SQL 中连接三个表时如何优化性能?

要优化性能,请确保为用于连接的列建立合适的索引,通过 WHERE 子句限制返回的行数,并仅选择必要的列。

我可以连接三个以上的表吗?

您可以在 SQL 中连接超过三个表,但查询可能会更复杂,并需要进行性能优化。

主题