MySQL 如何正确地在MySQL中应用CROSS JOIN?
CROSS JOIN(又称笛卡尔积或叉积)是 SQL 中的一种 join 操作,它返回两个表的所有可能的组合,即两个表中每行组合成的所有行。在 MySQL 中,可以使用 CROSS JOIN 语句来将两个或多个表中的所有记录组合在一起。本文将介绍如何在 MySQL 数据库中正确地应用 CROSS JOIN,同时提供示例代码。
阅读更多:MySQL 教程
基本语法
MySQL 中 CROSS JOIN 的基本语法如下:
SELECT column_name(s)
FROM table1
CROSS JOIN table2;
其中,column_name(s) 是要从表中返回的列名,table1 和 table2 是要合并的表名。
基本示例
我们来看一个基本的示例。假设我们有两个表,一个是 Customers 表,包含了客户的姓名、地址和手机号码,另一个是 Orders 表,包含了客户的订单信息和订单总价。我们想要返回每个客户的姓名、地址、订单号和订单总价。
Customers 表:
| ID | Name | Address | Phone |
|---|---|---|---|
| 1 | Alice | 123 Main St. | 555-555-5555 |
| 2 | Bob | 456 Broadway | 555-555-5556 |
| 3 | Charlie | 789 Market St. | 555-555-5557 |
Orders 表:
| OrderID | CustomerID | OrderDate | Total |
|---|---|---|---|
| 1 | 1 | Jan-5-2021 | 100 |
| 2 | 1 | Feb-3-2021 | 200 |
| 3 | 2 | Mar-10-2021 | 300 |
| 4 | 3 | Apr-2-2021 | 400 |
| 5 | 3 | May-1-2021 | 500 |
要返回每个客户的姓名、地址、订单号和订单总价,可以使用如下 SQL 语句:
SELECT Customers.Name, Customers.Address, Orders.OrderID, Orders.Total
FROM Customers
CROSS JOIN Orders;
运行结果:
| Name | Address | OrderID | Total |
|---|---|---|---|
| Alice | 123 Main St. | 1 | 100 |
| Alice | 123 Main St. | 2 | 200 |
| Alice | 123 Main St. | 3 | 300 |
| Alice | 123 Main St. | 4 | 400 |
| Alice | 123 Main St. | 5 | 500 |
| Bob | 456 Broadway | 1 | 100 |
| Bob | 456 Broadway | 2 | 200 |
| Bob | 456 Broadway | 3 | 300 |
| Bob | 456 Broadway | 4 | 400 |
| Bob | 456 Broadway | 5 | 500 |
| Charlie | 789 Market St. | 1 | 100 |
| Charlie | 789 Market St. | 2 | 200 |
| Charlie | 789 Market St. | 3 | 300 |
| Charlie | 789 Market St. | 4 | 400 |
| Charlie | 789 Market St. | 5 | 500 |
可以看到,该 SQL 语句返回了每个客户与每个订单的组合。
在多个表中应用 CROSS JOIN
在实际情况中,可能需要在多个表中使用 CROSS JOIN。假设我们有一个 Products 表,包含产品的名称和价格信息。我们要返回所有客户、订单和产品信息的组合。可以使用如下 SQL 语句:
SELECT Customers.Name, Customers.Address, Orders.OrderID, Orders.Total,
Products.ProductName, Products.Price
FROM Customers
CROSS JOIN Orders
CROSS JOIN Products;
运行结果:
| Name | Address | OrderID | Total | ProductName | Price |
|---|---|---|---|---|---|
| Alice | 123 Main St. | 1 | 100 | Product1 | 10 |
| Alice | 123 Main St. | 1 | 100 | Product2 | 20 |
| Alice | 123 Main St. | 1 | 100 | Product3 | 30 |
| Alice | 123 Main St. | 2 | 200 | Product1 | 10 |
| Alice | 123 Main St. | 2 | 200 | Product2 | 20 |
| Alice | 123 Main St. | 2 | 200 | Product3 | 30 |
| Alice | 123 Main St. | 3 | 300 | Product1 | 10 |
| Alice | 123 Main St. | 3 | 300 | Product2 | 20 |
| Alice | 123 Main St. | 3 | 300 | Product3 | 30 |
| Alice | 123 Main St. | 4 | 400 | Product1 | 10 |
| Alice | 123 Main St. | 4 | 400 | Product2 | 20 |
| Alice | 123 Main St. | 4 | 400 | Product3 | 30 |
| Alice | 123 Main St. | 5 | 500 | Product1 | 10 |
| Alice | 123 Main St. | 5 | 500 | Product2 | 20 |
| Alice | 123 Main St. | 5 | 500 | Product3 | 30 |
| Bob | 456 Broadway | 1 | 100 | Product1 | 10 |
| Bob | 456 Broadway | 1 | 100 | Product2 | 20 |
| Bob | 456 Broadway | 1 | 100 | Product3 | 30 |
| Bob | 456 Broadway | 2 | 200 | Product1 | 10 |
| Bob | 456 Broadway | 2 | 200 | Product2 | 20 |
| Bob | 456 Broadway | 2 | 200 | Product3 | 30 |
| Bob | 456 Broadway | 3 | 300 | Product1 | 10 |
| Bob | 456 Broadway | 3 | 300 | Product2 | 20 |
| Bob | 456 Broadway | 3 | 300 | Product3 | 30 |
| Bob | 456 Broadway | 4 | 400 | Product1 | 10 |
| Bob | 456 Broadway | 4 | 400 | Product2 | 20 |
| Bob | 456 Broadway | 4 | 400 | Product3 | 30 |
| Bob | 456 Broadway | 5 | 500 | Product1 | 10 |
| Bob | 456 Broadway | 5 | 500 | Product2 | 20 |
| Bob | 456 Broadway | 5 | 500 | Product3 | 30 |
| Charlie | 789 Market St. | 1 | 100 | Product1 | 10 |
| Charlie | 789 Market St. | 1 | 100 | Product2 | 20 |
| Charlie | 789 Market St. | 1 | 100 | Product3 | 30 |
| Charlie | 789 Market St. | 2 | 200 | Product1 | 10 |
| Charlie | 789 Market St. | 2 | 200 | Product2 | 20 |
| Charlie | 789 Market St. | 2 | 200 | Product3 | 30 |
| Charlie | 789 Market St. | 3 | 300 | Product1 | 10 |
| Charlie | 789 Market St. | 3 | 300 | Product2 | 20 |
| Charlie | 789 Market St. | 3 | 100 | Product3 | 30 |
| Charlie | 789 Market St. | 4 | 400 | Product1 | 10 |
| Charlie | 789 Market St. | 4 | 400 | Product2 | 20 |
| Charlie | 789 Market St. | 4 | 400 | Product3 | 30 |
| Charlie | 789 Market St. | 5 | 500 | Product1 | 10 |
| Charlie | 789 Market St. | 5 | 500 | Product2 | 20 |
| Charlie | 789 Market St. | 5 | 500 | Product3 | 30 |
可以看到,该 SQL 语句返回了每个客户、每个订单和每个产品的组合。
使用 WHERE 过滤 CROSS JOIN 中的记录
CROSS JOIN 操作通常会返回大量的数据,我们可以使用 WHERE 语句来过滤 CROSS JOIN 中的数据,筛选出符合条件的记录。例如,我们想要仅返回 Alice 所下的订单和对应的产品信息,可以使用如下 SQL 语句:
SELECT Customers.Name, Customers.Address, Orders.OrderID, Orders.Total,
Products.ProductName, Products.Price
FROM Customers
CROSS JOIN Orders
CROSS JOIN Products
WHERE Customers.Name='Alice' AND Orders.CustomerID=Customers.ID;
运行结果:
| Name | Address | OrderID | Total | ProductName | Price |
|---|---|---|---|---|---|
| Alice | 123 Main St. | 1 | 100 | Product1 | 10 |
| Alice | 123 Main St. | 1 | 100 | Product2 | 20 |
| Alice | 123 Main St. | 1 | 100 | Product3 | 30 |
| Alice | 123 Main St. | 2 | 200 | Product1 | 10 |
| Alice | 123 Main St. | 2 | 200 | Product2 | 20 |
| Alice | 123 Main St. | 2 | 200 | Product3 | 30 |
| Alice | 123 Main St. | 3 | 300 | Product1 | 10 |
| Alice | 123 Main St. | 3 | 300 | Product2 | 20 |
| Alice | 123 Main St. | 3 | 300 | Product3 | 30 |
| Alice | 123 Main St. | 4 | 400 | Product1 | 10 |
| Alice | 123 Main St. | 4 | 400 | Product2 | 20 |
| Alice | 123 Main St. | 4 | 400 | Product3 | 30 |
| Alice | 123 Main St. | 5 | 500 | Product1 | 10 |
| Alice | 123 Main St. | 5 | 500 | Product2 | 20 |
| Alice | 123 Main St. | 5 | 500 | Product3 | 30 |
可以看到,该 SQL 语句返回了仅包含 Alice 的订单和对应的产品信息的记录。
UNION 和 CROSS JOIN 的区别
在 SQL 中,UNION 和 CROSS JOIN 是两个不同的操作。UNION 用于将两个或多个 SELECT 查询的结果合并为一个结果集,而 CROSS JOIN 用于返回两个或多个表的笛卡尔积。对于需求不同的情况,需要使用不同的操作。
结论
CROSS JOIN 是 SQL 中的一种 join 操作,用于返回两个表的笛卡尔积。在 MySQL 中,可以使用 CROSS JOIN 将两个或多个表中的所有记录组合在一起。本文介绍了 MySQL 中 CROSS JOIN 的基本语法和示例,以及在多个表中应用 CROSS JOIN 和使用 WHERE 过滤记录的方法。但需要谨慎使用 CROSS JOIN,因为它会返回大量的数据,影响查询效率。在实际应用中需要根据情况选择合适的 JOIN 操作,以及使用 WHERE 条件过滤返回结果。
极客笔记