MySQL 笛卡尔连接

MySQL 笛卡尔连接

MySQL CROSS JOIN用于组合两个或更多表的所有可能性,并返回包含所有贡献表中每一行的结果。CROSS JOIN也被称为笛卡尔连接,它提供了所有关联表的笛卡尔积。笛卡尔积可以解释为第一个表中的所有行乘以第二个表中的所有行。它类似于内连接,但此语句中没有连接条件。

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

MySQL 笛卡尔连接

MySQL CROSS JOIN语法

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

SELECT column-lists
FROM table1
CROSS JOIN table2;

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

MySQL CROSS JOIN示例

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

CROSS JOIN子句用于连接两个表

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

表:customers

MySQL 笛卡尔连接

表格:联系人

MySQL 笛卡尔连接

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

SELECT *
FROM customers
CROSS JOIN contacts;

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

MySQL 笛卡尔连接

当执行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会引发错误,如下图所示:

MySQL 笛卡尔连接

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

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

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

MySQL 笛卡尔连接

左连接与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 笛卡尔连接

MySQL CROSS JOIN多个表

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

MySQL 笛卡尔连接

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

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

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

MySQL 笛卡尔连接

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程