Skip to content

SQL Right Join

RIGHT JOIN 子句(也写作 RIGHT OUTER JOIN)类似于 LEFT JOIN。它根据关联列组合来自两个表的行。然而,RIGHT JOIN 返回右表(table2)中的所有行以及左表(table1)中的匹配行。

如果在右表中某行没有匹配项,结果仍将包含该行,但来自左表的列中的值将为 NULL。

SELECT table1.column1, table2.column1, table2.column2, … FROM table1 RIGHT JOIN table2 ON table1.common_column = table2.common_column;

在 RIGHT OUTER JOIN 中,OUTER 关键字在大多数 SQL 数据库系统中是可选的,并且通常被省略。

从概念上讲,RIGHT JOIN 的工作原理如下:

Section titled “从概念上讲,RIGHT JOIN 的工作原理如下:”
  1. 它从 table2(在 RIGHT JOIN 后面指定的“右”表)中的所有行开始。

  2. 对于来自 table2 的每一行,它尝试根据 ON 子句中的条件在 table1(“左”表)中查找匹配行。

  3. 如果在 table1 中找到匹配行,则它们的列将与 table2 行组合。

  4. 如果在 table1 中未找到与 table2 行匹配的行,该 table2 行仍然包含在结果中,但从 table1 中选取的列将具有 NULL 值。

注意:任何 RIGHT JOIN 都可以通过简单地交换表的顺序来重写为 LEFT JOIN。例如,table1 RIGHT JOIN table2 等同于 table2 LEFT JOIN table1。许多开发人员更喜欢一致地使用 LEFT JOIN 以提高可读性。

在本例中,我们将使用两个表:

  • Orders:包含订单信息,列包括 OrderID 和 EmployeeID(引用 Employees 表的外键 Foreign Key)。

  • Employees:包含员工信息,列包括 EmployeeID(主键 Primary Key)、FirstName 和 LastName。

我们想要列出所有员工以及他们可能处理过的任何订单。

以下 SQL 语句将选择所有员工并列出他们处理过的订单。如果员工没有处理过任何订单,他们仍将被列出,但其订单相关字段将为 NULL。

SELECT O.OrderID, E.FirstName, E.LastName
FROM Orders O
RIGHT JOIN Employees E ON O.EmployeeID = E.EmployeeID
ORDER BY E.LastName, E.FirstName, O.OrderID;

关于结果的关键点:

  • 将包含 Employees 表中的所有员工。

  • 如果员工处理了多个订单,他们将出现多次。

  • 如果员工未处理任何订单,将列出他们的 FirstName 和 LastName,但 O.OrderID 将为 NULL。

SELECT O.OrderID, E.FirstName, E.LastName
FROM Employees E
LEFT JOIN Orders O ON E.EmployeeID = O.EmployeeID
ORDER BY E.LastName, E.FirstName, O.OrderID;

此 LEFT JOIN 版本通常因查询结构的一致性而更受欢迎。

当您需要获取“右侧”表中的所有记录以及“左侧”表中的任何匹配记录时,RIGHT JOIN 会很有用。例如,列出所有产品类别及其中的任何产品,确保即使当前没有任何产品,所有类别也会出现。

使用 RIGHT JOIN 查找未处理任何订单的员工:

SELECT E.FirstName, E.LastName
FROM Orders O
RIGHT JOIN Employees E ON O.EmployeeID = E.EmployeeID
WHERE O.OrderID IS NULL;