SQL 右连接

SQL Server 的右外连接返回右表中的所有记录,并匹配左表中的行。右连接也可以称为右外连接。因此,使用 Outer 关键字是可选的。请记住,左表中所有不匹配的行将用 NULL 值填充。其语法如下:

SELECT Table1.Column(s), Table2.Column(s),
FROM Table1
 RIGHT 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
 RIGHT JOIN
     Table2 ON
   Table1.Common_Column = Table2.Common_Column

为了更好地理解,让我们看看 SQL Server 右连接的视觉表示。从上图可以看出,它显示了 Table2 中的所有记录以及 Table1 中的匹配记录。

RIGHT OUTER JOIN Ven Diagram

对于这个右外连接示例,我们将使用数据库中的两个表。Employee 中的数据是

Left Table

SQL Server Department 表中存在的数据是:

Department Table 0

SQL 右连接选择所有列

以下右连接查询将显示 Department 表中的所有列以及 Employees 表中的匹配记录。

SELECT *
FROM [Employee]
 RIGHT OUTER JOIN
     [Department] ON
 [Employee].[DepartID] = [Department].[id]
Select All Columns 1

不带 Outer 关键字

正如我们之前所说,使用 Outer 关键字是可选的。所以,我将删除 Outer 关键字,并使用 SQL Server RIGHT JOIN 进行工作。

SELECT *
FROM [Employee]
 RIGHT OUTER JOIN
     [Department] ON
 [Employee].[DepartID] = [Department].[id]
SQL Right Join without Outer keyword Example 1

尽管 Employee 表有 15 条记录,但右连接显示了 13 条记录。这是因为

  • Employee 表中第 14 条和第 15 条记录的 Department ID 为 NULL,因此在右表中没有匹配的记录。
  • 如果您观察到第 8 条和第 9 条记录,它们显示了 NULL 值。因为在 Employee 表中,Department 表中的 Department ID 3 和 4(Module Lead 和 Team Lead)没有匹配的记录。因此它们被 NULL 替换了。

注意:[Department ID] 列重复出现两次,这会惹恼用户。通过选择单独的列名,我们可以避免不必要的列。因此,请避免使用 SELECT * 语句。

SQL 右外连接选择几列

请在 SELECT 语句 之后放置所需的列,以避免在 连接 中出现不必要的列。

SELECT [FirstName]
      ,[LastName]
      ,[DepartmentName]
FROM [Employee]
  RIGHT JOIN
     [Department] ON
  [Employee].[DepartID] = [Department].[id]

上面的右连接查询可以完美工作,只要 Employee 和 Department 表中的列名不同。如果它们具有相同的列名,您将收到错误。让我们看看如何解决这个问题。

在这里,我们使用了上面的右外连接查询。但是,我们添加了来自 department 表的 id 作为附加列。

SELECT [FirstName]
      ,[LastName]
      ,id
      ,[DepartmentName]
FROM [Employee]
RIGHT OUTER JOIN
     [Department] ON
           [Employee].[DepartID] = [Department].[id]

正如您所见,右连接引发了一个错误:Ambiguous column name id。这是因为 id 列同时存在于 Employee 和 department 表中。并且它无法识别您正在声明哪个列。

Ambiguous Column Name Error 2

为了解决这类问题,请在列名前使用表名。例如,下面的右外连接查询在列名前使用了 别名 表名。

通过这种方法,我们可以通知服务器我们正在查找属于 department 表的 id 列。

我们可以将之前的右外连接查询重写为

SELECT Emp.[FirstName] AS [First Name]
      ,Emp.[LastName] AS [Last Name]
	  ,Dept.id 
      ,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
RIGHT JOIN
     [Department] AS Dept ON
          Emp.[DepartID] = Dept.[id]
Solve Ambiguous column name id in RIGHT OUTER JOIN 3

SQL Server 右连接 WHERE 子句

它还允许我们使用 WHERE 子句 来限制返回的记录。在此示例中,我们将 WHERE 子句与右外连接一起使用。

SELECT Emp.[FirstName] AS [First Name]
      ,Emp.[LastName] AS [Last Name]
      ,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
RIGHT JOIN
     [Department] AS Dept ON
          Emp.[DepartID] = Dept.[id]
WHERE Emp.[FirstName] IS NOT NULL
RIGHT JOIN Where Clause Example 4

右连接 ORDER BY 子句

它允许我们使用 Order By 子句来重新排列记录的顺序。

SELECT Emp.[FirstName] AS [First Name]
      ,Emp.[LastName] AS [Last Name]
      ,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
 RIGHT JOIN
     [Department] AS Dept ON
    Emp.[DepartID] = Dept.[id]
ORDER BY [FirstName] ASC
RIGHT JOIN Order By Clause 3