MySQL 交叉连接

MySQL 交叉连接会返回两个表的笛卡尔积。交叉连接不需要任何公共列来连接两个表。笛卡尔积表示表 1 中的行数乘以表 2 中的行数。

MySQL 交叉连接语法

交叉连接的基本语法如下所示。

SELECT Table1.Column(s), Table2.Column(s),
FROM Table1
 CROSS JOIN
     Table2 

--OR We can Simply Write it as
SELECT Table1. Column(s), Table2. Column(s),
FROM Table1, Table2

让我们通过截图直观地了解一下交叉连接,以便更好地理解。从下面的截图中,您可以轻松地理解 MySQL 交叉连接会显示两个表的笛卡尔积。这意味着表 A 中的每条记录都与表 B 中的每条记录组合在一起。

CROSS JOIN Visual Representation

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

Left Table rows 10

MySQL Department 表中的数据为

right table rows 11

MySQL 交叉连接示例

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

使用 Select * 的 MySQL 交叉连接

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

USE company;
SELECT * FROM employ
   CROSS JOIN department;

如果您观察下面的截图,它显示了 135 条记录。这意味着 Employ 表中的 15 行乘以 Department 表中的 9 行。

MySQL CROSS JOIN Select * all

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

选择几列

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

USE company;
SELECT First_Name, Last_Name, Education, 
       DepartmentName, Standard_Salary,
       Yearly_Income, Sales
FROM employ
	CROSS JOIN department;
Select Few Columns 2

MySQL 交叉连接中的歧义列

只要两个表(employ 和 Department)中的列名不同,上面的查询就能完美运行。如果它们在两个表中具有相同的列名会怎样?嗯,使用上述方法,您会陷入混乱。让我们看看如何解决这个问题。

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

USE company;
SELECT First_Name, Last_Name, Education, 
	DeptID, DepartmentName, Standard_Salary,
        Yearly_Income, Sales
FROM employ
	CROSS JOIN department;

从下面的截图可以看到,它抛出了一个错误:歧义列 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
	CROSS JOIN department AS dept;
Solve Ambiguous Columns in CROSS JOIN 4

注意:始终建议在列名前使用表名。例如:SELECT employ.First_Name

MySQL 交叉连接 WHERE 子句示例

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

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
	CROSS JOIN department AS dept
WHERE Yearly_Income > 1000000;
CROSS JOIN 5

命令提示符示例

让我向您展示如何使用命令提示符编写此查询。在此交叉连接示例中,我们向您展示了如何将其与 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
	CROSS JOIN department AS dept
ORDER BY First_Name, Last_Name;