51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

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

SQL JOIN

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

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

|OrderID|CustomerID|OrderDate| |-|-|-| |10308|2|1996-09-18| |10309|37|1996-09-19| |10310|77|1996-09-20|

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

|CustomerID|CustomerName|ContactName|Country| |-|-|-|-| |1|Alfreds Futterkiste|Maria Anders|Germany| |2|Ana Trujillo Emparedados y helados|Ana Trujillo|Mexico| |3|Antonio Moreno Taquería|Antonio Moreno|Mexico|

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

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

示例

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;

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

|OrderID|CustomerName|OrderDate| |-|-|-| |10308|Ana Trujillo Emparedados y helados|9/18/1996| |10365|Antonio Moreno Taquería|11/27/1996| |10383|Around the Horn|12/16/1996| |10355|Around the Horn|11/15/1996| |10278|Berglunds snabbköp|8/12/1996|

不同类型的SQL JOIN

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

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

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

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

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

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

SQL INNER JOIN

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

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

|ProductID|ProductName|CategoryID|Price| |-|-|-|-| |1|Chais|1|18| |2|Chang|1|19| |3|Aniseed Syrup|2|10|

以及Categories表的一部分选择:

|CategoryID|CategoryName|Description| |-|-|-| |1|Beverages|Soft drinks, coffees, teas, beers, and ales| |2|Condiments|Sweet and savory sauces, relishes, spreads, and seasonings| |3|Confections|Desserts, candies, and sweet breads|

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

示例

使用INNER JOIN关键字连接ProductsCategories

SELECT ProductID, ProductName, CategoryName
FROM Products
INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID;

SQL INNER JOIN

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

语法

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

指定列名

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

示例

指定表名:

SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Products
INNER 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.CategoryName
FROM Products
JOIN Categories ON Products.CategoryID = Categories.CategoryID;

连接三个表

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

示例

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER 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 table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

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

SQL LEFT JOIN

演示数据库

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

以下是"Customers"表的部分选择:

|CustomerID|CustomerName|ContactName|Address|City|PostalCode|Country| |-|-|-|-|-|-|-| |1|Alfreds Futterkiste|Maria Anders|Obere Str. 57|Berlin|12209|Germany| |2|Ana Trujillo Emparedados y helados|Ana Trujillo|Avda. de la Constitución 2222|México D.F.|05021|Mexico| |3|Antonio Moreno Taquería|Antonio Moreno|Mataderos 2312|México D.F.|05023|Mexico|

以及"Orders"表的部分选择:

|OrderID|CustomerID|EmployeeID|OrderDate|ShipperID| |-|-|-|-|-| |10308|2|7|1996-09-18|3| |10309|37|3|1996-09-19|1| |10310|77|8|1996-09-20|2|

示例

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

SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderDate
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

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

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

赞(0)
未经允许不得转载:工具盒子 » SQL JOIN 子句:合并多个表中相关行的完整指南