📜  MySQL交叉联接

📅  最后修改于: 2020-11-18 03:18:59             🧑  作者: Mango

MySQL交叉加入

MySQL CROSS JOIN用于合并两个或多个表的所有可能性,并返回包含所有贡献表中每一行的结果。交叉联接也称为CARTESIAN 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示例

让我们举一些例子来了解Left Join或Left Outer Join子句的工作方式:

CROSS JOIN子句,用于联接两个表

在这里,我们将创建两个表“ 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;

执行完上面的查询后,我们将获得以下输出:

左加入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。执行以下语句以加入三个表的客户,订单和联系人。在此语句中,首先在订单和联系人之间完成CROSS JOIN,然后根据指定条件执行LEFT JOIN。

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

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