SQL Server 的左外连接(Left Outer Join)返回左表中的所有行或记录,并匹配右表中的记录。其可视化表示如下所示。
下图显示了 Table1 中的所有记录以及 Table2 中的匹配记录。右表中所有不匹配的行将被 NULL 值填充。

Left Join 子句的语法如下所示。
-- Syntax
SELECT Table1.Column(s), Table2.Column(s),
FROM Table1
LEFT OUTER JOIN
Table2 ON
Table1.Common_Column = Table2.Common_Column
--OR We can Simply Write it as
SELECT Table1. Column(s), Table2. Column(s),
FROM Table1
LEFT JOIN
Table2 ON
Table1.Common_Column = Table2.Common_Column
Left join 也可以称为 Left outer join。因此,使用 Outer 关键字是可选的。在本例中,我们使用 Employee 表。

部门

SQL Server 左连接选择所有列
以下查询将显示 Employees 表中的所有列以及 Department 表中的匹配记录。
SELECT *
FROM [Employee]
LEFT OUTER JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]

避免使用 Outer 关键字
我将删除 SQL LEFT JOIN 中可选的 Outer 关键字,它也能正常工作。如您所见,它在结果集中返回两个表中的行。
SELECT *
FROM [Employee]
LEFT JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]

如果您观察到上述截图,Employee 表中有 15 条记录。左连接显示了 15 条记录,但对于 [DepartID]、id 和 [Department Name],ID 号为 10、11、14 和 15 的记录显示了 NULL 值。这是因为它们在 Employee 表中的 Department Id 为 NULL,因此在右表中没有匹配的记录。
[Department ID] 列重复了两次,这会使用户感到烦恼。通过选择单个列名,我们可以避免不需要的列。因此,请避免使用 SELECT * 语句。
SQL Server 左连接选择部分列
请在 SELECT 语句 之后放置所需的列,以避免在 SQL Server 的 连接 中出现不需要的列。
-- Select Few Columns Example
SELECT [FirstName]
,[LastName]
,[DepartmentName]
FROM [Employee]
LEFT JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]

上述查询在两个表中的列名不同(如上所示)时可以正常工作。如果两个表中存在相同的列名,则会引发错误。例如,我们使用上述查询。但是,我们添加了 Department 表中的 id 作为附加列。
SELECT [FirstName]
,[LastName]
,id
,[DepartmentName]
FROM [Employee]
LEFT OUTER JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]
如您所见,Left Join 引发了错误,即“模糊的列名 id”。这是因为 id 存在于两个表中。服务器不知道您请求检索哪个 id 列。

为了解决这类问题,请始终在列名前使用表名。以下查询在列名前使用了表别名。通过这种方法,我们可以表明我们要查找与部门相关的 id。我们可以重写上述查询为:
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.id
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
LEFT JOIN
[Department] AS Dept ON
Emp.[DepartID] = Dept.[id]

SQL Server 左外连接也允许我们使用 Where 子句来限制返回的行数。在这里,我们结合使用 WHERE 子句。
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
LEFT JOIN
[Department] AS Dept ON
Emp.[DepartID] = Dept.[id]
WHERE Dept.[DepartmentName] IS NOT NULL

它还允许我们使用 Order By 子句来重新排列记录的顺序。
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
LEFT JOIN
[Department] AS Dept ON
Emp.[DepartID] = Dept.[id]
ORDER BY [DepartmentName] ASC
