写点什么

SQL JOIN 子句:合并多个表中相关行的完整指南

作者:小万哥
  • 2023-11-26
    广东
  • 本文字数:1908 字

    阅读完需:约 6 分钟

SQL JOIN 子句:合并多个表中相关行的完整指南

SQL JOIN

JOIN 子句用于基于它们之间的相关列合并来自两个或更多表的行。


让我们看一下“Orders”表的一部分选择:



然后,看一下“Customers”表的一部分选择:



注意,“Orders”表中的“CustomerID”列是指“Customers”表中的“CustomerID”。上述两个表之间的关系是“CustomerID”列。


然后,我们可以创建以下 SQL 语句(包含 INNER JOIN),选择在两个表中具有匹配值的记录:

示例

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDateFROM OrdersINNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
复制代码


它将产生类似于以下的结果:


不同类型的 SQL JOIN

以下是 SQL 中不同类型的 JOIN:


  • (INNER) JOIN:返回在两个表中具有匹配值的记录

  • LEFT (OUTER) JOIN:返回左表中的所有记录以及右表中匹配的记录

  • RIGHT (OUTER) JOIN:返回右表中的所有记录以及左表中匹配的记录

  • FULL (OUTER) JOIN:在左表或右表中有匹配时返回所有记录


这些 JOIN 类型可以根据您的需求选择,以确保检索到所需的数据。希望这能帮助你理解 SQL 中 JOIN 的概念。如果有其他问题,请随时告诉我。

SQL INNER JOIN

INNER JOIN 关键字选择在两个表中具有匹配值的记录。


让我们看一下Products表的一部分选择:



以及Categories表的一部分选择:



我们将使用两个表的CategoryID字段连接Products表和Categories表:

示例

使用 INNER JOIN 关键字连接ProductsCategories


SELECT ProductID, ProductName, CategoryNameFROM ProductsINNER JOIN Categories ON Products.CategoryID = Categories.CategoryID;
复制代码

SQL INNER JOIN

注意:INNER JOIN 关键字仅返回两个表中具有匹配值的行。这意味着如果您有一个没有CategoryID的产品,或者CategoryIDCategories表中不存在的记录,该记录将不会在结果中返回。

语法

SELECT column_name(s)FROM table1INNER JOIN table2ON table1.column_name = table2.column_name;
复制代码

指定列名

在 SQL 语句中指定列时,最好在列名前包含表名。

示例

指定表名:


SELECT Products.ProductID, Products.ProductName, Categories.CategoryNameFROM ProductsINNER JOIN Categories ON Products.CategoryID = Categories.CategoryID;
复制代码


上面的示例在不指定表名的情况下也可以工作,因为指定的列名在两个表中都不存在。如果尝试在 SELECT 语句中包含CategoryID,则如果不指定表名,将会出现错误(因为CategoryID在两个表中都存在)。

JOIN 或 INNER JOIN

JOIN 和 INNER JOIN 将返回相同的结果。


INNER 是 JOIN 的默认连接类型,因此当您写 JOIN 时,解析器实际上会写 INNER JOIN。

示例

JOIN 与 INNER JOIN 相同:


SELECT Products.ProductID, Products.ProductName, Categories.CategoryNameFROM ProductsJOIN Categories ON Products.CategoryID = Categories.CategoryID;
复制代码

连接三个表

以下 SQL 语句选择具有客户和承运商信息的所有订单:

示例

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperNameFROM ((OrdersINNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);
复制代码


INNER JOIN 用于将多个表中的数据连接在一起,以便根据关联列的匹配情况检索相应的数据。希望这帮助你理解 INNER JOIN 的使用方式。如果有其他问题,请随时提出。

SQL LEFT JOIN 关键字

SQL LEFT JOIN 关键字返回左表(table1)中的所有记录以及右表(table2)中的匹配记录。如果没有匹配,则右侧的结果为 0 条记录。

LEFT JOIN 语法

SELECT column_name(s)FROM table1LEFT JOIN table2ON table1.column_name = table2.column_name;
复制代码


注意:在某些数据库中,LEFT JOIN 被称为 LEFT OUTER JOIN。

SQL LEFT JOIN

演示数据库

在本教程中,我们将使用著名的 Northwind 示例数据库。


以下是“Customers”表的部分选择:



以及“Orders”表的部分选择:


示例

假设我们想要检索所有客户以及他们的订单(如果有的话)。我们可以使用 LEFT JOIN 将两个表连接在一起,以便即使某些客户没有订单,它们仍然会在结果中显示。


SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderDateFROM CustomersLEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
复制代码


在这个例子中,LEFT JOIN 确保了所有的客户都会出现在结果中,而与之关联的订单信息(如果存在的话)也会被检索出来。如果某个客户没有订单,相应的 OrderID 和 OrderDate 列将显示为 NULL。


希望这能帮助你理解 SQL 中 LEFT JOIN 的使用方式。如果有其他问题,请随时提出。

最后

为了方便其他设备和平台的小伙伴观看往期文章:公众号搜索Let us Coding,或者扫描下方二维码,关注公众号,即可获取最新文章。


看完如果觉得有帮助,欢迎点赞、收藏关注



发布于: 刚刚阅读数: 3
用户头像

小万哥

关注

代码如人生 2023-02-09 加入

编程爱好者

评论

发布
暂无评论
SQL JOIN 子句:合并多个表中相关行的完整指南_MySQL_小万哥_InfoQ写作社区