MySQL CROSS JOIN

2025年3月17日 | 阅读 3 分钟

MySQL CROSS JOIN 用于组合两个或多个表的**所有可能性**,并返回包含所有参与表的所有行的结果。CROSS JOIN 也称为笛卡尔 JOIN,它提供所有关联表的笛卡尔积。笛卡尔积可以解释为第一个表中的所有行乘以第二个表中的所有行。它类似于 Inner Join,但没有 JOIN 条件。

我们可以通过以下可视化表示来理解它,其中 CROSS JOIN 返回 table1 和 table2 中的所有记录,并且每一行都是两个表行的组合。

MySQL CROSS JOIN

MySQL CROSS JOIN 语法

CROSS JOIN 关键字始终与 SELECT 语句一起使用,并且必须写在 FROM 子句之后。以下语法会获取两个连接表的所有记录。

在上面的语法中,column-lists 是您要返回的列或字段的名称,table1 和 table2 是从中获取记录的表名。

MySQL CROSS JOIN 示例

让我们通过一些示例来理解 Left Join 或 Left Outer Join 子句的工作原理。

用于连接两个表的 CROSS JOIN 子句

在这里,我们将创建两个表 **"customers"** 和 **"contacts"**,它们包含以下数据:

表:customers

MySQL CROSS JOIN

表:contacts

MySQL CROSS JOIN

要获取两个表的所有记录,请执行以下查询:

成功执行查询后,将得到以下输出:

MySQL CROSS JOIN

当执行 CROSS JOIN 语句时,您会发现它显示了 42 行。这意味着 customers 表中的七行乘以 contacts 表中的六行。

注意:为避免重复的列结果出现两次,建议使用单个列名而不是 SELECT * 语句。

MySQL CROSS JOIN 中的歧义列问题

有时,我们需要从多个表中获取选定的列记录。这些表可能包含一些相似的列名。在这种情况下,MySQL CROSS JOIN 语句会引发错误:列名不明确。这意味着列名同时存在于两个表中,MySQL 无法确定您想要显示哪个列。以下示例将更清晰地解释这一点:

上面的 CROSS JOIN 会像下面的图片一样引发错误:

MySQL CROSS JOIN

通过在列名前加上表名,可以解决此问题。上述查询可以重写为:

执行上述查询后,我们将得到以下输出:

MySQL CROSS JOIN

带 WHERE 子句的 LEFT JOIN

WHERE 子句用于从表中返回**过滤后的**结果。以下示例通过 CROSS JOIN 子句来说明这一点:

此语句产生以下结果:

MySQL CROSS JOIN

MySQL CROSS JOIN 连接多个表

我们已经创建了名为 "customers" 和 "orders" 的两个表。让我们再创建一个名为 "contacts" 的表,其中包含以下数据:

MySQL CROSS JOIN

在这里,我们将解释如何使用三个表进行 CROSS JOIN 和 LEFT JOIN。执行以下语句来连接三个表 customers、orders 和 contacts。在此语句中,首先在 orders 和 contacts 之间完成 CROSS JOIN,然后根据指定的条件执行 LEFT JOIN。

成功执行上述查询后,将得到以下输出:

MySQL CROSS JOIN
下一个主题MySQL SELF JOIN