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 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关键字连接Products
和Categories
:
SELECT ProductID, ProductName, CategoryName
FROM Products
INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID;
SQL INNER JOIN
注意:INNER JOIN关键字仅返回两个表中具有匹配值的行。这意味着如果您有一个没有CategoryID
的产品,或者CategoryID
在Categories
表中不存在的记录,该记录将不会在结果中返回。
语法
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用于将多个表中的数据连接在一起,以便根据关联列的匹配情况检索相应的数据
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
演示数据库
以下是“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。
最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding
,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎 点赞、收藏、关注