首页 > 其他分享 >`FULL JOIN` 和 `UNION ALL`

`FULL JOIN` 和 `UNION ALL`

时间:2024-09-12 09:52:12浏览次数:13  
标签:FULL JOIN UNION NULL id ###

在 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`!如果有其他问题,请随时问我。

标签:FULL,JOIN,UNION,NULL,id,###
From: https://www.cnblogs.com/mengbin0546/p/18409595

相关文章

  • MySQL 中的 JOIN 操作:连接数据的强大工具
    在MySQL数据库的使用中,JOIN操作是一个非常重要且强大的功能,它允许我们从多个表中检索数据,从而实现更复杂的查询和数据分析。今天,我们就来深入了解一下MySQL中的JOIN操作。一、为什么需要JOIN操作?在实际的数据库应用中,数据通常被分散存储在多个表中。例如,一个电商系统可......
  • 【0326】Postgres内核之 VACUUM (FULL)构建所有要 VACUUM 的 relation(s) list(17)
    上一篇:【0325】Postgres内核之VACUUM(FULL)创建BufferAccessStrategyobject(16)1.构建vacuum关系表(reltaions)List在上一篇文章中讲解了Postgres内核创建缓冲区策略对象,之后初始化给全局指针变量vac_strategy。接下来Postgres将通过vacuum()函数的参数,以确认用户......
  • crontab on raspberry pi, full path, not relative path, is needed.
    Sources: https://forums.raspberrypi.com/viewtopic.php?t=296993 thanksthagrol,thanksRaTTuS,youareright.Igetwrong.10****reboot->isnotrebootin10min.Itisnexthouratminute10reboot*/10****reboot->itisrebbotin10minB......
  • [Typescript] Toggle full screen
    constrequestFullscreenProps=["requestFullScreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullScreen",]asconst;constexitFullScreenProps=["exitFullscreen","......
  • Mysql高级篇(中)——七种常见的 join 查询图
    注意:MySQL是不支持FULLOUTERJOIN这种语法的,因此要实现图中6、7的查询结果,可以使用UNION关键字结合LEFTJOIN、RIGHTJOIN实现,UNION可以实现去重的效果;参考如下代码:--MySQL中图标6的实现方式SELECT*FROMtableAALEFTJOINtableBBONA.key=B.ke......
  • sql之left join、right join、inner join的区别
    1、leftjoin(左联接)返回包括左表中的所有记录和右表中联结字段相等的记录2、rightjoin(右联接)返回包括右表中的所有记录和左表中联结字段相等的记录3、innerjoin(等值连接)只返回两个表中联结字段相等的行举例如下:--------------------------------------------表A记录如......
  • How to use Node.js to get all files full paths that nested in folders All In On
    HowtouseNode.jstogetallfilesfullpathsthatnestedinfoldersAllInOne如何使用Node.js获取文件夹中嵌套的所有文件的完整路径demosESM//❌//importfsfrom'node:fs/promises';//✅import*asfsfrom'node:fs/promises';//import*asfsf......
  • 联合远景2010介绍《Joint Vision 2010》
    ......
  • HarmonyOS沉浸式模式FullScreen
    import{window}from'@kit.ArkUI'classFullScreen{//开启全屏asyncenable(){constctx=AppStorage.get<Context>('context')!constwin=awaitwindow.getLastWindow(ctx)win.setWindowLayoutFullScreen(true)//顶部安全区......
  • 工业图像输出卡设计原理图:FMC214-基于FMC兼容1.8V IO的Full Camera Link 输出子卡
    FMC214-基于FMC兼容1.8VIO的FullCameraLink输出子卡  一、板卡概述 基于FMC兼容1.8V IO的Full Camera Link 输出子卡支持Base、Middle、Full Camera link信号输出,兼容1.8V、2.5V、3.3V IO FPGA信号输出。适配xilinx不同型号开发板和公司内部各......