Sql 简明教程
SQL - Cross Join
The SQL Cross Join
SQL Cross Join 是用于检索两个单独表的笛卡尔积(或交叉积)的基本类型内连接。也就是说,此连接会将第一张表中的每一行与第二张表中的每一行组合在一起(即排列)。
以下示例图以简单的方式说明了交叉连接。
如你所见,我们考虑了两个表格列:发型和发质。这些列中的每一个都包含一些需要匹配的记录。因此,使用交叉连接,我们将“发型”列中的每条记录与“发质”列中的所有记录组合在一起。所得结果表被认为是笛卡尔积或连接表。
Example
假设我们使用以下查询创建了一张名为 CUSTOMERS 的表,其中包含客户的个人详细信息,包括他们的姓名、年龄、地址和薪水等:
CREATE TABLE CUSTOMERS (
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
现在,使用如下所示的 INSERT 语句向此表中插入值:
INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 );
该表将被创建为:
ID |
NAME |
AGE |
ADDRESS |
SALARY |
1 |
Ramesh |
32 |
Ahmedabad |
2000.00 |
2 |
Khilan |
25 |
Delhi |
1500.00 |
让我们创建另一个名为 ORDERS 的表,其中包含所做的订单和下单日期的详细信息。
CREATE TABLE ORDERS (
OID INT NOT NULL,
DATE VARCHAR (20) NOT NULL,
CUSTOMER_ID INT NOT NULL,
AMOUNT DECIMAL (18, 2)
);
使用 INSERT 语句像下面这样向该表中插入值:
INSERT INTO ORDERS VALUES
(100, '2009-10-08 00:00:00', 3, 1500.00),
(101, '2009-11-20 00:00:00', 2, 1560.00);
该表显示如下:
OID |
DATE |
CUSTOMER_ID |
AMOUNT |
100 |
2009-10-08 00:00:00 |
3 |
1500.00 |
101 |
2009-11-20 00:00:00 |
2 |
1560.00 |
现在,如果我们对上面给出的这两个表执行以下 Cross Join query ,交叉连接将会将 CUSTOMERS 表中的每一行与 ORDERS 表中的每一行组合在一起。
SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
CROSS JOIN ORDERS;
Joining Multiple Tables with Cross Join
我们也可以使用交叉连接连接多于两张表。在这种情况下,将显示多路排列,结果表预计将比单独的表包含更多的记录。
Syntax
以下是如何在 SQL 中使用交叉连接联接多个表的语法:
SELECT column_name(s)
FROM table1
CROSS JOIN table2
CROSS JOIN table3
CROSS JOIN table4
....
....
....
CROSS JOIN tableN;
Example
假设我们使用以下查询创建了一个名为 ORDER_RANGE 的其他表:
CREATE TABLE ORDER_RANGE (
SNO INT NOT NULL,
ORDER_RANGE VARCHAR (20) NOT NULL
);
现在,我们可以使用 INSERT 语句将值插入到此空表中,如下所示:
INSERT INTO ORDER_RANGE VALUES
(1, '1-100'),
(2, '100-200'),
(3, '200-300');
ORDER_RANGE 表被创建如下:
SNO |
ORDER_RANGE |
1 |
1-100 |
2 |
100-200 |
3 |
200-300 |
以下查询使用交叉连接将三个表 CUSTOMERS、ORDERS 和 ORDER_RANGE 组合起来:
SELECT ID, NAME, AMOUNT, DATE, ORDER_RANGE
FROM CUSTOMERS
CROSS JOIN ORDERS
CROSS JOIN ORDER_RANGE;
Output
生成的表如下:
ID |
NAME |
AMOUNT |
DATE |
ORDER_RANGE |
2 |
Khilan |
1560 |
2009-11-20 00:00:00 |
1-100 |
1 |
Ramesh |
1560 |
2009-11-20 00:00:00 |
1-100 |
2 |
Khilan |
1500.00 |
2009-10-08 00:00:00 |
1-100 |
1 |
Ramesh |
1500.00 |
2009-10-08 00:00:00 |
1-100 |
2 |
Khilan |
1560 |
2009-11-20 00:00:00 |
100-200 |
1 |
Ramesh |
1560 |
2009-11-20 00:00:00 |
100-200 |
2 |
Khilan |
1500.00 |
2009-10-08 00:00:00 |
100-200 |
1 |
Ramesh |
1500.00 |
2009-10-08 00:00:00 |
100-200 |
2 |
Khilan |
1560 |
2009-11-20 00:00:00 |
200-300 |
1 |
Ramesh |
1560 |
2009-11-20 00:00:00 |
200-300 |
2 |
Khilan |
1500.00 |
2009-10-08 00:00:00 |
200-300 |
1 |
Ramesh |
1500.00 |
2009-10-08 00:00:00 |
200-300 |