MySQL Cross Join交叉连接

MySQL CROSS JOIN 用于组合两个或多个表的所有可能性,并返回包含所有贡献表的每一行的结果。CROSS JOIN 也称为 CARTESIAN JOIN,它提供所有关联表的笛卡尔积。笛卡尔积可以解释为第一个表中存在的所有行乘以第二个表中存在的所有行。它类似于 Inner Join,其中连接条件在此子句中不可用。

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

一、MySQL CROSS JOIN 语法

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

SELECT column-lists  
FROM table1  
CROSS JOIN table2;  

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

二、MySQL CROSS JOIN 示例

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

在这里,我们将创建两个表“customers”和“contacts”,其中包含以下数据:

customers表:

contacts表:

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

SELECT *  
FROM customers  
CROSS JOIN contacts;  

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

当执行 CROSS JOIN 语句时,您会观察到它显示了 42 行。这意味着客户表中的七行乘以联系人表中的六行。

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

三、MySQL CROSS JOIN 中的不明确列问题

有时,我们需要从多个表中获取选定的列记录。这些表可以包含一些类似的列名。在这种情况下,MySQL CROSS JOIN 语句会抛出错误:列名不明确。这意味着列的名称存在于两个表中,并且 MySQL 对您要显示哪一列感到困惑。以下示例更清楚地解释了它:

SELECT customer_id, cust_name, income, order_id, price  
FROM customer  
CROSS JOIN orders;  

上面的 CROSS JOIN 会抛出如下图所示的错误:

这个问题可以通过在列名之前使用表名来解决。上面的查询可以重写为:

SELECT customer.customer_id, customer.cust_name, customer.income, orders.order_id, orders.price  
FROM customer  
CROSS JOIN orders;  

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

四、LEFT JOIN 与 WHERE 子句

WHERE 子句用于从表中返回过滤结果。以下示例使用 CROSS JOIN 子句说明了这一点:

SELECT customers.customer_id, customers.cust_name, customers.income, orders.order_id, orders.price  
FROM customers  
CROSS JOIN orders  
USING(customer_id) WHERE price>1500 AND price<5000;  

该语句给出以下结果:

五、MySQL CROSS JOIN 多个表

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

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

SELECT * FROM customer  
LEFT JOIN(orders CROSS JOIN contacts)  
ON customer.customer_id=contact_id  
ORDER BY income;  

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

热门文章

优秀文章