SQL Right Join
SQL RIGHT JOIN 子句
Section titled “SQL RIGHT JOIN 子句”SQL RIGHT JOIN 子句
Section titled “SQL RIGHT JOIN 子句”RIGHT JOIN 子句(也写作 RIGHT OUTER JOIN)类似于 LEFT JOIN。它根据关联列组合来自两个表的行。然而,RIGHT JOIN 返回右表(table2)中的所有行以及左表(table1)中的匹配行。
如果在右表中某行没有匹配项,结果仍将包含该行,但来自左表的列中的值将为 NULL。
SQL RIGHT JOIN 语法
Section titled “SQL RIGHT JOIN 语法”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 的工作原理如下:”-
它从
table2(在RIGHT JOIN后面指定的“右”表)中的所有行开始。 -
对于来自
table2的每一行,它尝试根据ON子句中的条件在table1(“左”表)中查找匹配行。 -
如果在
table1中找到匹配行,则它们的列将与table2行组合。 -
如果在
table1中未找到与table2行匹配的行,该table2行仍然包含在结果中,但从table1中选取的列将具有NULL值。
注意:任何 RIGHT JOIN 都可以通过简单地交换表的顺序来重写为 LEFT JOIN。例如,table1 RIGHT JOIN table2 等同于 table2 LEFT JOIN table1。许多开发人员更喜欢一致地使用 LEFT JOIN 以提高可读性。
演示数据库上下文
Section titled “演示数据库上下文”在本例中,我们将使用两个表:
-
Orders:包含订单信息,列包括OrderID和EmployeeID(引用Employees表的外键 Foreign Key)。 -
Employees:包含员工信息,列包括EmployeeID(主键 Primary Key)、FirstName和LastName。
我们想要列出所有员工以及他们可能处理过的任何订单。
SQL RIGHT JOIN 示例
Section titled “SQL RIGHT JOIN 示例”以下 SQL 语句将选择所有员工并列出他们处理过的订单。如果员工没有处理过任何订单,他们仍将被列出,但其订单相关字段将为 NULL。
SELECT O.OrderID, E.FirstName, E.LastNameFROM Orders ORIGHT JOIN Employees E ON O.EmployeeID = E.EmployeeIDORDER BY E.LastName, E.FirstName, O.OrderID;关于结果的关键点:
-
将包含
Employees表中的所有员工。 -
如果员工处理了多个订单,他们将出现多次。
-
如果员工未处理任何订单,将列出他们的
FirstName和LastName,但O.OrderID将为NULL。
使用 LEFT JOIN 的相同结果:
Section titled “使用 LEFT JOIN 的相同结果:”SELECT O.OrderID, E.FirstName, E.LastNameFROM Employees ELEFT JOIN Orders O ON E.EmployeeID = O.EmployeeIDORDER BY E.LastName, E.FirstName, O.OrderID;此 LEFT JOIN 版本通常因查询结构的一致性而更受欢迎。
当您需要获取“右侧”表中的所有记录以及“左侧”表中的任何匹配记录时,RIGHT JOIN 会很有用。例如,列出所有产品类别及其中的任何产品,确保即使当前没有任何产品,所有类别也会出现。
使用 RIGHT JOIN 查找未处理任何订单的员工:
SELECT E.FirstName, E.LastNameFROM Orders ORIGHT JOIN Employees E ON O.EmployeeID = E.EmployeeIDWHERE O.OrderID IS NULL;