本教程将学习和演示如何使用SQL CROSS JOIN
生成连接表的笛卡尔积。
1. SQL CROSS JOIN子句简介
交叉连接是一种连接操作,它生成两个或多个表的笛卡尔积。
在数学中,笛卡尔积是一种返回多组产品集的数学运算。
例如,有两组集合:A {x,y,z}
和B {1,2,3}
,A x B
的笛卡尔乘积是所有有序对(x,1)
,(x,2)
, (x,3)
,(y,1)
,(y,2)
,(y,3)
,(z,1)
,(z,2)
,(z,3)
。
下图说明了A
和B
的笛卡尔积:
类似地,在SQL中,两个表A
和B
的笛卡尔乘积是结果集,其中第一个表(A
)中的每一行与第二个表(B
)中的每一行配对。 假设A
表有n
行,而B
表有m
行,那么A
和B
表的交叉连接结果有n x m
行。
以下是CROSS JOIN
子句的语法:
SELECT column_list
FROM A
CROSS JOIN B;
下图说明了表A
和表B
之间的交叉连接的结果。在图中,表A
具有三行记录:1
,2
和3
,而表B
也具有三行记录:x
,y
和z
。 那么笛卡尔积结果有九行:
注意,与INNER JOIN,LEFT JOIN和FULL OUTER JOIN不同,CROSS JOIN子句没有连接条件。
以下语句等同于使用上面的CROSS JOIN
子句的语句:
SELECT
column_list
FROM
A,
B;
2. SQL CROSS JOIN示例
我们将创建两个用于演示交叉连接的新表:
sales_organization
表存储销售组织。sales_channel
表存储销售渠道。
以下语句用于创建sales_organization
和sales_channel
表:
-- 创建表1
CREATE TABLE sales_organization (
sales_org_id INT PRIMARY KEY,
sales_org VARCHAR (255)
);
-- 创建表2
CREATE TABLE sales_channel (
channel_id INT PRIMARY KEY,
channel VARCHAR (255)
);
假设该公司有两个国内(Domestic
)和出口(Export
)销售组织,负责国内和国际市场的销售。
以下语句将两个销售组织插入sales_organization
表:
INSERT INTO sales_organization (sales_org_id, sales_org)
VALUES
(1, 'Domestic'),
(2, 'Export');
该公司可以通过批发(Wholesale
),零售(Retail
),电子商务(eCommerce
)和电视购物(TV Shopping
)等各种渠道分销商品。 以下语句将销售渠道插入sales_channel
表:
INSERT INTO sales_channel (channel_id, channel)
VALUES
(1, 'Wholesale'),
(2, 'Retail'),
(3, 'eCommerce'),
(4, 'TV Shopping');
要查找销售组织可以拥有的所有可能的销售渠道,可以使用CROSS JOIN
将sales_organnel
表与sales_channel
表连接,如下所示:
SELECT
sales_org,
channel
FROM
sales_organization
CROSS JOIN sales_channel;
执行上面查询语句,得到以下结果 -
结果集包括sales_organization
和sales_channel
表中的所有行记录。
以下查询等效于使用上面的CROSS JOIN
子句的语句:
SELECT
sales_org,
channel
FROM
sales_organization,
sales_channel;
在某些数据库系统(如PostgreSQL和Oracle)中,可以使用INNER JOIN
子句,其条件始终求值为true
以执行交叉连接,例如:
SELECT
sales_org,
channel
FROM
sales_organization
INNER JOIN sales_channel ON 1 = 1;
在本教程中,学习了如何使用SQL CROSS JOIN
子句生成两个或多个表的笛卡尔积。