`FULL JOIN` 和 `UNION ALL`
在 SQL 中,`FULL JOIN` 和 `UNION ALL` 是两种不同的操作,它们的结果也有显著的区别。
### FULL JOIN
`FULL JOIN`(全外连接)会返回两张表中所有的记录。对于没有匹配的记录,结果中会用 `NULL` 填充缺失的部分。具体来说:
- 如果表 A 和表 B 中有匹配的记录,这些记录会合并在一起。
- 如果表 A 中有记录在表 B 中没有匹配,结果中会显示这些记录,表 B 的字段会用 `NULL` 填充。
- 如果表 B 中有记录在表 A 中没有匹配,结果中会显示这些记录,表 A 的字段会用 `NULL` 填充。
### UNION ALL
`UNION ALL` 会将两张表的所有记录合并在一起,包括重复的记录。它不会去除重复项,也不会进行任何匹配。具体来说:
- 表 A 的所有记录会被列出。
- 表 B 的所有记录会被列出。
- 如果表 A 和表 B 中有相同的记录,它们会在结果中重复出现。
### 举例说明
假设有以下两张表:
**表 A**
| id | name |
|----|-------|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
**表 B**
| id | age |
|----|-----|
| 2 | 30 |
| 3 | 25 |
| 4 | 40 |
- 使用 `FULL JOIN` 的结果:
| id | name | age |
|----|--------|------|
| 1 | Alice | NULL |
| 2 | Bob | 30 |
| 3 | Charlie| 25 |
| 4 | NULL | 40 |
- 使用 `UNION ALL` 的结果:
| id | name | age |
|----|--------|------|
| 1 | Alice | NULL |
| 2 | Bob | NULL |
| 3 | Charlie| NULL |
| NULL | NULL | 30 |
| NULL | NULL | 25 |
| NULL | NULL | 40 |
### 总结
- `FULL JOIN` 关注的是两张表的匹配和缺失记录,结果中会合并相关字段。
- `UNION ALL` 只是简单地将两张表的记录叠加在一起,不考虑匹配关系。
希望这个解释能帮助你理解这两者之间的区别!
在 Hive 中,虽然没有直接的 `FULL JOIN` 语法,但可以通过组合 `LEFT JOIN` 和 `RIGHT JOIN` 来实现类似的效果。下面是一个示例,展示如何在 Hive 中创建两张表,并使用 `FULL JOIN` 和 `UNION ALL` 来结合它们的结果。
### 创建表
```sql
CREATE TABLE TableA (
id INT,
name STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
CREATE TABLE TableB (
id INT,
age INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
```
### 插入数据
```sql
-- 插入 TableA 的数据
INSERT INTO TABLE TableA VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie'),
(4, 'David'),
(5, 'Eva');
-- 插入 TableB 的数据
INSERT INTO TABLE TableB VALUES
(2, 30),
(3, 25),
(4, 40),
(6, 28),
(7, 22);
### 使用 FULL JOIN 的实现
在 Hive 中,可以通过 `LEFT JOIN` 和 `RIGHT JOIN` 来模拟 `FULL JOIN`:
```sql
-- FULL JOIN 的实现
SELECT
A.id AS A_id,
A.name,
B.id AS B_id,
B.age
FROM
TableA A
LEFT JOIN
TableB B ON A.id = B.id
UNION ALL
SELECT
A.id AS A_id,
A.name,
B.id AS B_id,
B.age
FROM
TableA A
RIGHT JOIN
TableB B ON A.id = B.id
WHERE
A.id IS NULL; -- 只选择 TableB 中没有匹配的记录
```
### 使用 UNION ALL
使用 `UNION ALL` 来合并两张表的所有记录:
```sql
SELECT
id,
name,
FROM
TableA
UNION ALL
SELECT
id,
age
FROM
TableB;
```
### 结果示例
1. **FULL JOIN 的结果**(模拟):
| A_id | name | B_id | age |
|------|---------|------|-----|
| 1 | Alice | NULL | NULL|
| 2 | Bob | 2 | 30 |
| 3 | Charlie | 3 | 25 |
| 4 | David | 4 | 40 |
| 5 | Eva | NULL | NULL|
| NULL | NULL | 6 | 28 |
| NULL | NULL | 7 | 22 |
2. **UNION ALL 的结果**:
| id | name | age |
|-----|---------|-----|
| 1 | Alice | NULL|
| 2 | Bob | NULL|
| 3 | Charlie | NULL|
| 4 | David | NULL|
| 5 | Eva | NULL|
| 2 | NULL | 30 |
| 3 | NULL | 25 |
| 4 | NULL | 40 |
| 6 | NULL | 28 |
| 7 | NULL | 22 |
### 总结
- 在 Hive 中,使用 `LEFT JOIN` 和 `RIGHT JOIN` 的组合来模拟 `FULL JOIN`。
- `UNION ALL` 将两张表的记录简单地合并在一起,不考虑匹配关系。
希望这个示例能帮助你理解如何在 Hive 中使用 `FULL JOIN` 和 `UNION ALL`!如果有其他问题,请随时问我。