SQL LEFT JOIN

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]
SQL Server Left Join Select All Columns

避免使用 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 列。

Left Join Ambiguous column

为了解决这类问题,请始终在列名前使用表名。以下查询在列名前使用了表别名。通过这种方法,我们可以表明我们要查找与部门相关的 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]
Alias Table Name

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
Left Join and Where Clause

它还允许我们使用 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
Left Join and Order By Clause