MySQL 右连接

MySQL 右外连接 (Right Outer Join) 是一种类型,用于返回右表中的所有现有记录(或行),以及左表中的匹配行。左表中所有不匹配的行都将用 NULL 值填充。

右外连接也称为右连接 (Right Join)。因此,使用 Outer 关键字是可选的。

MySQL 右连接语法

右外连接的基本语法如下所示

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

让我们来看一下右外连接的视觉表示,以便更好地理解。

Visual Representation 1

从上图可以看出,MySQL 右外连接显示了表 B 中的所有记录,以及表 A 中的匹配行。

为了演示右外连接,我们将使用我们公司数据库中的 Employ 和 Department 表。Employ 表中的数据是

Employee table Rows

MySQL Department 表中的数据是

Department Table Rows

MySQL 右外连接示例

以下是我们可以使用此右连接来合并两个表或从两个或多个表中获取信息(记录)的方法列表。

使用 SELECT * 进行右连接

以下右外连接查询显示了 Department 表中的所有列以及 Employ 表中的匹配记录

USE company;
SELECT *  FROM employ
    RIGHT OUTER JOIN department
	ON employ.DeptID = department.DeptID;

如果您观察下面的截图,右外连接显示了 Department 表和 Employ 表中的 12 条记录。但 Employ 表中的最后两行返回了 NULL 值。这是因为 Employ 表中那些记录的 DeptID 为 NULL。

MySQL RIGHT JOIN 2

注意: DeptID 列重复了两次,这可能会让最终用户感到烦恼。为了避免不必要的列,我建议您选择单独的列名。请避免在右外连接中使用 SELECT * 语句。

MySQL 右连接选择部分列

正如我们之前所说,请在 SELECT 语句后使用所需的列,以避免不必要的列。

USE company;
SELECT First_Name, Last_Name, Education, 
       Yearly_Income, Sales,
       DepartmentName, Standard_Salary
FROM employ
    RIGHT JOIN department
	ON employ.DeptID = department.DeptID;
Select Few Columns 3

MySQL 右连接处理歧义列

上面的右连接查询可以完美运行,只要 Employ 和 Department 表中的列名不同,如上所示。如果它们在两个表中具有相同的列名会怎样?嗯,使用上面指定的方法,您会陷入混乱。让我们看看如何解决这个问题。

我将向您展示一个右连接歧义列的实际示例。正如您所见,我们使用了相同的右连接查询。但是,我们从 Department 表中添加了 DepID 作为附加列。

USE company;
SELECT  First_Name, Last_Name, Education, 
        Yearly_Income, Sales,
	DeptID, DepartmentName, Standard_Salary
FROM employ
    RIGHT JOIN department
	ON employ.DeptID = department.DeptID;

正如您所见,它抛出了一个错误:歧义列 DeptID。这是因为 DeptID 列同时存在于两个表中,而 MySQL 查询不知道您要求它显示哪一列。

error 1052: Ambiguous column ID 4

要解决 MySQL 右外连接中的这类问题,您必须始终在列名之前使用表名。以下查询在列名前使用了表名别名。通过这种方法,我们可以告知右连接查询我们正在查找属于 Department 表的 DepID。

我们可以简单地将上述查询写为

USE company;
SELECT  emp.First_Name,	emp.Last_Name, emp.Education,
		emp.Yearly_Income, emp.Sales,
        dept.DeptID, dept.DepartmentName, dept.Standard_Salary
FROM employ AS emp
	RIGHT OUTER JOIN department AS dept
		ON emp.DeptID = dept.DeptID;
MySQL RIGHT JOIN Ambitious Column 5

注意:在右外连接中,始终建议在列名前使用表名。例如,SELECT employ.First_Name

使用 USING 关键字进行右连接

如果两个表中的公共列名相同,则可以使用 USING 关键字。这里 DeptID 是两个表中的公共列名,因此上面的查询也可以返回为

USE company;
SELECT  emp.First_Name,	emp.Last_Name, emp.Education,
		emp.Yearly_Income, emp.Sales,
        dept.DepartmentName, dept.Standard_Salary
FROM employ AS emp
	RIGHT OUTER JOIN department AS dept
		USING(DeptID);
RIGHT OUTER JOIN 6

MySQL 右连接使用多个条件

到目前为止,我们一直使用 = 运算符作为连接 Employ 和 Department 表的条件。但您可以将 = 替换为 <(小于)、>(大于)或不等于运算符。在此示例中,我们使用两个条件来右连接这两个表。

以下右连接查询显示了 Employ 表的所有记录以及 Department 表的匹配记录。这里的匹配记录意味着两个表的 DeptID 应该匹配,并且年收入应大于 800000。

USE company;
SELECT  empl.First_Name, empl.Last_Name, empl.Education, 
        empl.Yearly_Income, empl.Sales,
	dept.DepartmentName, dept.Standard_Salary
FROM employ AS empl
    RIGHT JOIN department AS dept
	ON empl.DeptID = dept.DeptID AND
           empl.Yearly_Income > 800000;

我认为您对结果感到困惑。让我将大于符号替换为小于。这意味着两个表的 DeptID 应该匹配,并且年收入应小于 1000000。

MySQL 右外连接 WHERE 子句示例

在此示例中,我们展示了如何将 WHERE 子句(应用过滤器)与右外连接一起使用。我建议您参考 WHERE 子句文章。

USE company;
SELECT  empl.First_Name, empl.Last_Name, empl.Education, 
        empl.Yearly_Income, empl.Sales,
	dept.DepartmentName, dept.Standard_Salary
FROM employ AS empl
    RIGHT JOIN department AS dept
	ON empl.DeptID = dept.DeptID
WHERE Standard_Salary > 750000;
Right Join Where Clause Example 9

右连接命令提示符示例

让我向您展示如何使用命令提示符编写右外连接查询。在此示例中,我们还展示了如何将 ORDER BY 子句与右外连接一起使用。我建议您参考 ORDER BY 文章。

USE company;
SELECT  empl.First_Name, empl.Last_Name, empl.Education, 
        empl.Yearly_Income, empl.Sales,
	dept.DepartmentName, dept.Standard_Salary
FROM employ AS empl
    RIGHT JOIN department AS dept
	ON empl.DeptID = dept.DeptID
ORDER BY First_Name, Last_Name;