📅  最后修改于: 2023-12-03 15:32:59.583000             🧑  作者: Mango
在MS SQL Server中,左联接和右联接被广泛地用于合并两个表的数据。这些联接类型的主要区别在于如何包含没有匹配行的表中的数据。
左联接是从左边的表中选择所有的行,同时匹配右表中与左表中的行相符合的行,并将它们组合在一起。如果右表中没有与左表中的行匹配的行,则会使用 NULL 值填充结果集。
SELECT *
FROM 左表
LEFT JOIN 右表
ON 左表.列名 = 右表.列名;
假设我们有两个表 顾客
(Customers) 和 订单
(Orders):
Customers 表
| CustomerID | CustomerName | ContactName | Country | |:----------:|:------------:|:-----------:|:-------:| | 1 | Alfreds | Maria Anders| Germany| | 2 | Ana Trujillo| Ana Trujillo| Mexico | | 3 | Antonio Moreno | Antonio Moreno| Mexico | | 4 | Around the Horn| Thomas Hardy| UK |
Orders 表
| OrderID | CustomerID | OrderDate | |:-------:|:----------:|:--------:| | 1 | 2 |2019-04-15| | 2 | 4 |2019-04-16| | 3 | 3 |2019-04-17| | 4 | 3 |2019-04-18| | 5 | 2 |2019-04-19|
现在我们可以使用左联接来获取所有的顾客以及他们拥有的订单,即使他们没有任何订单:
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
结果
| CustomerName | OrderID | |:---------------:|:--------:| | Alfreds | NULL | | Ana Trujillo | 1 | | Antonio Moreno | 3 | | Antonio Moreno | 4 | |Around the Horn | 2 |
注意到顾客 Alfreds
没有任何订单,但是在结果集中仍然出现,并使用 NULL 填充了没有匹配的列。
右联接是从右边的表中选择所有的行,同时匹配左表中与右表中的行相匹配的行,并将它们组合在一起。如果左表中没有与右表中的行匹配的行,则会使用 NULL 值填充结果集。
SELECT *
FROM 左表
RIGHT JOIN 右表
ON 左表.列名 = 右表.列名;
使用上述示例中的 Customers
和 Orders
表,我们可以使用右联接来获取所有的订单以及与其相关联的顾客,即使他们没有任何顾客:
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
结果
| CustomerName | OrderID | |:---------------:|:--------:| | Ana Trujillo | 1 | |Around the Horn | 2 | | Antonio Moreno | 3 | | Antonio Moreno | 4 | | NULL | 5 |
注意到订单 5
没有任何关联的顾客,但是在结果集中仍然出现,并使用 NULL 填充了没有匹配的列。
左联接和右联接都是被广泛地用于合并两个表的数据,区别在于如何包含没有匹配行的表中的数据。左联接包含左表中的所有行和右表中与左表匹配的行,右联接包含右表中的所有行和左表中与右表匹配的行。这两个联接类型可以用来执行复杂的数据查询和分析,特别是当您需要对大型数据源进行连接和筛选时。