MySQL Left Join

如何使用命令提示符和Workbench编写MySQL Left outer Join示例?Left outer join返回第一个表的所有记录(或行),并匹配右表中的行。Left Join的基本语法如下所示

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

您可以选择使用Outer关键字,因为两者是相同的。让我们通过MySQL Left Outer join的视觉表示来更好地理解。

Ven Diagram 1

从上面的图像中,您可以轻松理解Left Outer join显示了表A中的所有记录以及表B中的匹配记录。来自MySQL右表的未匹配行将用NULL值填充。

为了演示此MySQL Left outer join,我们将使用公司数据库中的Employ和Department表。Employ中的数据为

Employee Table rows 10

Department中的数据为

department table rows 11

MySQL Left Join示例

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

Left Join Select * 示例

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

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

如果您观察下面的屏幕截图,MySQL Left Join会显示Employ中的所有15条记录。但是对于[DeptID]、Department Name和Standard_Salary,EmpID号为4、5、9、11和15的记录将显示NULL值。

这是因为Employ中这些记录的DeptID为NULL。因此,右表中没有匹配的记录。

MySQL Left Join Select * Example 2

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

选择几列示例

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

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

MySQL Left Join中的歧义列示例

上述Left join查询将完全正常工作,只要Employ和Department中的列名不同,如上所示。但是,如果两个表中的列名相同,会发生什么?嗯,使用上述方法,您将陷入混乱。那么,让我们看看如何解决这个问题。

让我给您一个实际的例子。正如您所见,我们正在使用相同的left join查询。但是,我们已将Department中的DepID作为附加列添加。

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

正如您所见,它会引发错误:Ambiguous column DeptID。这是因为DeptID列存在于两个表中,而查询不知道您要求它显示哪个列。

Error 1052 - Ambiguous column DeptID Error 4

要解决此问题,请始终在列名前使用表名。例如,以下查询在列名前使用了别名表名。

这种方法告诉查询,我们正在查找属于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
	LEFT JOIN department AS dept
		ON emp.DeptID = dept.DeptID;
Solving Left Outer Join Ambitious Error

在Left Outer Join中,始终在列名前使用表名是一个最佳实践。例如,SELECT employ.First_Name

使用关键字的MySQL Left Join

如果两个表中的公共列名相同,则可以使用带USING关键字的Left Join。由于DeptID是两个表中的公共列名,因此上述查询也可以表示为

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
	LEFT JOIN department AS dept
		USING(DeptID);
Left Join using Keyword 6

MySQL Left Join多条件

到目前为止,我们一直使用=运算符作为Employ和Department表的条件。但是,您可以将=替换为<(小于)、>(大于)或不等于运算符。

在此示例中,我们使用两个条件来连接这两个表。以下查询将显示所有员工记录和匹配的部门行。这里的匹配记录意味着两个表的DeptID应该匹配,并且Standard Salary应该大于1000000

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
    LEFT JOIN department AS dept
	ON empl.DeptID = dept.DeptID AND
           dept.Standard_Salary > 1000000;
Left Join Multiple Conditions 7

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

Multiple Conditions 8

MySQL Left Join Where子句示例

在此示例中,我们将向您展示如何使用Where子句(应用过滤器)。我建议您参考《Where Clause》一文。

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
    LEFT JOIN department AS dept
	ON empl.DeptID = dept.DeptID
WHERE Sales > 20000;
Left Join Where Clause 9

命令提示符示例

我将向您展示如何在命令提示符中编写它。在此示例中,我们还将展示如何将其与Order By子句一起使用。我建议您参考《Order By》一文。

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