MySQL 内连接

MySQL 内连接返回两个表中都存在的记录或行,只要列之间至少有一个匹配。或者,我们可以简单地说,内连接返回两个表中存在的行(或记录),只要 ON 关键字之后的条件为 TRUE。

Inner 是默认的连接。所以你可以选择使用 INNER 关键字。让我们通过视觉表示来更好地理解它。

从上面的截图,你可以轻松地理解内连接只显示表 A 和表 B 中的匹配记录(类似于数学中的交集)。

MySQL 内连接语法

内连接的基本语法如下所示

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

对于这个内连接示例,我们将使用公司数据库中的 Employ 和 Department 表。Employ 表中的数据是

Department 表中的数据

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

MySQL 内连接 SELECT * 示例

以下查询显示 Employ 和 Department 表中存在的所有列

eUSE company;
SELECT * FROM employ
   INNER JOIN department
      ON employ.DeptID = department.DeptID;

如果你观察下面的截图,虽然 Employ 表中有 15 条记录,但内连接显示了 10 条记录。这是因为 Employ 表中其余 5 条记录(即 EmpID 号为 4、5、9、11 和 15)的 DeptID 值为空。

MySQL INNER JOIN Select * Example 2

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

内连接选择部分列

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

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

MySQL 内连接中的歧义列

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

我来给你举一个实际例子。正如你所见,我们使用了相同的内连接查询。但是,我们添加了 Department 表中的 DepID 作为附加列。

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

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

解决歧义列错误

要解决此类问题,请始终在列名之前使用表名。

以下查询在列名前使用了表名别名。通过这种方法,我们可以告知服务器我们正在查找属于 Department 表的 DepID。我们可以简单地将上面的查询写成

USE company;
SELECT  emp.First_Name, 
	emp.Last_Name, 
        emp.Education, 
	dept.DeptID, dept.DepartmentName, dept.Standard_Salary,
        emp.Yearly_Income, emp.Sales
FROM employ AS emp
	INNER JOIN department AS dept
		ON emp.DeptID = dept.DeptID;
INNER JOIN AVOID Ambiguous Columns using ALIAS Names 5

注意:在连接中使用表名而不是列名始终是最佳实践(避免混淆)。例如,SELECT employ.First_Name

MySQL 内连接和 USING 关键字

如果两个表中的公共列名相同,则使用 USING 关键字。上面的查询也可以写成

USE company;
SELECT  emp.First_Name, 
	emp.Last_Name, 
        emp.Education, 
	dept.DepartmentName, dept.Standard_Salary,
        emp.Yearly_Income, emp.Sales
FROM employ AS emp
	INNER JOIN department AS dept
		USING (DeptID); -- Or use standard way
Inner Join USING Keyword 6

MySQL 内连接多个条件

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

在此示例中,我们使用两个条件来连接这些表。首先,DeptId 必须匹配,并且年收入必须小于标准工资。

USE company;
SELECT  emp.First_Name, 
	emp.Last_Name, 
        emp.Education, 
	dept.DepartmentName, dept.Standard_Salary,
        emp.Yearly_Income, emp.Sales
FROM employ AS emp
   INNER JOIN department AS dept
	ON emp.DeptID = dept.DeptID AND
           emp.Yearly_Income < dept.Standard_Salary;
Inner Join multiple conditions 7

内连接 WHERE 子句示例

在此示例中,我们展示了如何使用 WHERE 子句将过滤器应用于内连接。我建议你参考“Where Clause”文章。

USE company;
SELECT  emp.First_Name, 
	emp.Last_Name, 
        emp.Education, 
	dept.DepartmentName, dept.Standard_Salary,
        emp.Yearly_Income, emp.Sales
FROM employ AS emp
	INNER JOIN department AS dept
		ON emp.DeptID = dept.DeptID
WHERE Yearly_Income > 900000;
Inner Join Where Clause 8

MySQL 内连接和 ORDER BY 子句

我来向你展示如何在命令提示符下编写查询。在此示例中,我们展示了如何使用 ORDER BY 子句来排序数据。我建议你参考“Order By”文章。

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