MySQL 笛卡尔连接
MySQL CROSS JOIN用于组合两个或更多表的所有可能性,并返回包含所有贡献表中每一行的结果。CROSS JOIN也被称为笛卡尔连接,它提供了所有关联表的笛卡尔积。笛卡尔积可以解释为第一个表中的所有行乘以第二个表中的所有行。它类似于内连接,但此语句中没有连接条件。
我们可以通过以下可视化表示来理解它,其中CROSS JOIN返回表1和表2中的所有记录,每一行都是两个表的行的组合。
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
表格:联系人
要从两个表中获取所有记录,请执行以下查询:
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;
执行上述查询后,我们将得到以下输出:
左连接与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”,其中包含以下数据:
在这里,我们将使用三个表通过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;
在成功执行以上查询之后, 将给出如下输出: