用实际的例子来说明full join 与 cross join 的区别
时间: 2023-10-27 17:53:56 浏览: 101
好的,我们来通过实际的例子来说明全连接(FULL JOIN)和交叉连接(CROSS JOIN)之间的区别。
假设有两个表:表A和表B,它们的结构如下:
**表A**:
```
+----+--------+
| ID | Name |
+----+--------+
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie|
+----+--------+
```
**表B**:
```
+----+-------+
| ID | Score |
+----+-------+
| 1 | 85 |
| 3 | 92 |
| 4 | 78 |
+----+-------+
```
现在我们想要获取两个表的笛卡尔积和匹配的行。
**交叉连接(CROSS JOIN)**:
```sql
SELECT * FROM tableA
CROSS JOIN tableB;
```
结果:
```
+----+--------+----+-------+
| ID | Name | ID | Score |
+----+--------+----+-------+
| 1 | Alice | 1 | 85 |
| 1 | Alice | 3 | 92 |
| 1 | Alice | 4 | 78 |
| 2 | Bob | 1 | 85 |
| 2 | Bob | 3 | 92 |
| 2 | Bob | 4 | 78 |
| 3 | Charlie| 1 | 85 |
| 3 | Charlie| 3 | 92 |
| 3 | Charlie| 4 | 78 |
+----+--------+----+-------+
```
交叉连接返回了表A和表B中所有可能的组合,生成了一个包含所有行的结果集。
**全连接(FULL JOIN)**:
```sql
SELECT * FROM tableA
FULL JOIN tableB
ON tableA.ID = tableB.ID;
```
结果:
```
+----+--------+----+-------+
| ID | Name | ID | Score |
+----+--------+----+-------+
| 1 | Alice | 1 | 85 |
| 2 | Bob | NULL| NULL |
| 3 | Charlie| 3 | 92 |
| NULL| NULL | 4 | 78 |
+----+--------+----+-------+
```
全连接返回了表A和表B中所有匹配和不匹配的行,并将它们合并在一起。如果某一行在一个表中有匹配项而在另一个表中没有,则会用NULL值填充。在这个例子中,ID为2的Bob在表B中没有匹配项,ID为4的行在表A中没有匹配项,因此对应的列用NULL填充。
总结:
- 交叉连接返回了两个表的笛卡尔积,没有匹配条件。
- 全连接返回了两个表的匹配和不匹配的行,并将它们合并在一起,需要使用ON子句来指定连接条件。
希望以上例子能够清晰地展示全连接和交叉连接之间的区别。如有任何疑问,请随时提问。