📜  MS SQL Server中的左联接和右联接(1)

📅  最后修改于: 2023-12-03 15:32:59.583000             🧑  作者: Mango

MS SQL Server中的左联接和右联接

在MS SQL Server中,左联接和右联接被广泛地用于合并两个表的数据。这些联接类型的主要区别在于如何包含没有匹配行的表中的数据。

左联接 (LEFT JOIN)

左联接是从左边的表中选择所有的行,同时匹配右表中与左表中的行相符合的行,并将它们组合在一起。如果右表中没有与左表中的行匹配的行,则会使用 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 填充了没有匹配的列。

右联接 (RIGHT JOIN)

右联接是从右边的表中选择所有的行,同时匹配左表中与右表中的行相匹配的行,并将它们组合在一起。如果左表中没有与右表中的行匹配的行,则会使用 NULL 值填充结果集。

SELECT *
FROM 左表 
RIGHT JOIN 右表 
ON 左表.列名 = 右表.列名;
示例

使用上述示例中的 CustomersOrders 表,我们可以使用右联接来获取所有的订单以及与其相关联的顾客,即使他们没有任何顾客:

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 填充了没有匹配的列。

总结

左联接和右联接都是被广泛地用于合并两个表的数据,区别在于如何包含没有匹配行的表中的数据。左联接包含左表中的所有行和右表中与左表匹配的行,右联接包含右表中的所有行和左表中与右表匹配的行。这两个联接类型可以用来执行复杂的数据查询和分析,特别是当您需要对大型数据源进行连接和筛选时。