虽然 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 中 Products 表示例。图片来源:作者。
SQL 中 Orders 表示例。图片来源:作者。
首先,您可以连接 Customers 和 Orders 表,以展示哪些客户下了订单及其订单详情,例如 order_id、order_date 和订购的 quantity。
SELECT
Customers. customer_id,
Customers. first_name,
Customers. last_name,
Orders. order_id,
Orders. order_date,
Orders. quantity
FROM Customers
INNER JOIN Orders
ON Customers. customer_id = Orders. customer_id; 技术支持
SQL 连接 Customers 与 Orders 表示例。图片来源:作者。
最后,您可以将 Customers、Orders 和 Products 三个表合并,以获取客户、其订单、所购产品以及每个订单总成本的全景视图。
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
FROM Customers
INNER JOIN Orders
ON Customers. customer_id = Orders. customer_id
INNER JOIN Products
ON Orders. product_id = Products. product_id; 技术支持
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
Customers. customer_id,
Customers. customer_name,
Orders. order_id,
Products. product_name
FROM Customers
INNER JOIN Orders
ON Customers. customer_id = Orders. customer_id
INNER JOIN Products
ON Orders. product_id = Products. product_id; 技术支持
使用 LEFT JOIN
LEFT JOIN 返回第一个(左侧)表中的所有记录,以及来自其他两个表的匹配记录;如果没有匹配,右侧表的列会返回 NULL。当需要从主表中检索所有记录,即使有些行在其他表中没有关联数据时,LEFT JOIN 非常有用。
在下面的示例中,所有客户都会出现在结果中,即使他们尚未下单。若没有匹配的订单或产品数据,相应数据字段会返回 NULL 值。
SELECT
Customers. customer_id,
Customers. customer_name,
Orders. order_id,
Products. product_name
FROM Customers
LEFT JOIN Orders
ON Customers. customer_id = Orders. customer_id
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
Customers. customer_id,
Customers. customer_name,
Orders. order_id,
Products. product_name
FROM Customers
RIGHT JOIN Orders
ON Customers. customer_id = Orders. customer_id
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 进行数据分析方面的能力,并让您的简历更具竞争力。
虽然 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 中 Products 表示例。图片来源:作者。
SQL 中 Orders 表示例。图片来源:作者。
首先,您可以连接
Customers和Orders表,以展示哪些客户下了订单及其订单详情,例如order_id、order_date和订购的quantity。SQL 连接 Customers 与 Orders 表示例。图片来源:作者。
最后,您可以将
Customers、Orders和Products三个表合并,以获取客户、其订单、所购产品以及每个订单总成本的全景视图。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。下面的查询仅检索已下单的客户,并包含与每个订单相关的产品详情。使用 LEFT JOIN
LEFT JOIN返回第一个(左侧)表中的所有记录,以及来自其他两个表的匹配记录;如果没有匹配,右侧表的列会返回NULL。当需要从主表中检索所有记录,即使有些行在其他表中没有关联数据时,LEFT JOIN非常有用。在下面的示例中,所有客户都会出现在结果中,即使他们尚未下单。若没有匹配的订单或产品数据,相应数据字段会返回
NULL值。需要说明的是,在 SQL 中
LEFT JOIN与LEFT OUTER JOIN含义相同。我们有一篇详细教程:SQL LEFT JOIN vs. LEFT OUTER JOIN。使用 RIGHT JOIN
RIGHT JOIN会检索第三个(最右侧)表中的所有记录,以及来自左侧表的匹配记录。尽管RIGHT JOIN较少使用,但当您需要优先考虑最右侧表中的记录时,它依然很有帮助。例如,在进行库存分析时,您可能想了解哪些产品有订单或客户交互。下面的查询会列出所有产品,并包含相关的订单或客户数据。如果某些产品尚未被订购,
order_id和customer_name字段将显示NULL。尽管上面的示例分别演示了单一类型的连接(
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 进行数据分析方面的能力,并让您的简历更具竞争力。