各种JOIN的区别

1. Inner Join(Join , 内连接)

功能:
返回两个表中都有的记录信息
也称之为自然连接
inner可以省略,inner join = join

图解:
在这里插入图片描述
语法:

SELECT columns
FROM Table_A A
INNER JOIN Table_B B
ON A.column = B.column;

结果:
仅包含两个表中匹配的行。

支持:

JoinTypeMysqlOracleHive
Inner Join

2. Left Outer Join(Left join , 左外连接)

功能:
返回左表中的所有记录,以及右表中匹配的记录。如果右表中没有匹配,则结果中的右表列显示为 NULL。
Outer可以省略,Left Outer join = Left join

图解:
在这里插入图片描述
语法:

SELECT columns
FROM Table_A A
LEFT JOIN Table_B B
ON A.column = B.column;

结果:
包含左表的所有行,如果在右表中没有匹配,则相应的右表列为 NULL。

支持:

JoinTypeMysqlOracleHive
Left Join

变种功能
返回左表中那些没有在右表查找到的对应行。

图解
在这里插入图片描述
语法:

SELECT columns
FROM Table_A A
LEFT JOIN Table_B B
ON A.column = B.column
WHERE B.column IS NULL;

结果
仅返回A表中不包含B表的记录

举例
假设 Table A 和 Table B中有以下数据:
Table A

PKValue
1A1
2A2
3A3
4A4
5A5

Table B

PKValue
2B2
3B3
4B4
6B6
7B7

通过
A LEFT JOIN B
ON A.PK = B.PK WHERE B.PK IS NULL
返回结果

A.PKB.PKA.ValueB.Value
1NULLA1NULL
5NULLA5NULL

3. Right Outer Join(Left join , 左外连接)

功能:
返回右表中的所有记录,以及左表中匹配的记录。如果左表中没有匹配,则结果中的左表列显示为 NULL。
Outer可以省略,Right Outer join = Right join

图解:
在这里插入图片描述

语法:

SELECT columns
FROM Table_A A
RIGHT JOIN Table_B B
ON A.column = B.column;

结果:
包含右表的所有行,如果在左表中没有匹配,则相应的左表列为 NULL。

支持:

JoinTypeMysqlOracleHive
Right Join

变种功能
返回右表中那些没有在左表查找到的对应行。

图解
在这里插入图片描述

语法:

SELECT columns
FROM Table_A A
RIGHT JOIN Table_B B
ON A.column = B.column
WHERE A.column IS NULL;

结果
仅返回B表中不包含A表的记录

举例
假设 Table A 和 Table B中有以下数据:
Table A

PKValue
1A1
2A2
3A3
4A4
5A5

Table B

PKValue
2B2
3B3
4B4
6B6
7B7

通过
A RIGHT JOIN B
ON A.PK = B.PK WHERE A.PK IS NULL
返回结果

A.PKB.PKA.ValueB.Value
NULL6NULLB6
NULL7NULLB7

4. Full Outer Join(Full Join , 全连接)

功能:
返回左表和右表中的所有记录。如果没有匹配,则对应表的列显示为 NULL。
Outer可以省略,Full Outer Join = Full Join

图解:
在这里插入图片描述

语法:

SELECT columns
FROM Table_A A
FULL JOIN Table_B B
ON A.column = B.column;

结果:
包含左表和右表中的所有行。未匹配的行在对应列中显示为 NULL。

支持:

JoinTypeMysqlOracleHive
Full Join×

变种功能
返回左表和右表中不存在交集的记录。

图解
在这里插入图片描述

语法:

SELECT columns
FROM Table_A A
FULL JOIN Table_B B
ON A.column = B.column
WHERE A.column IS NULL OR B.column

结果
仅返回A表和B表的差集

举例
假设 Table A 和 Table B中有以下数据:
Table A

PKValue
1A1
2A2
3A3
4A4
5A5

Table B

PKValue
2B2
3B3
4B4
6B6
7B7

通过
A FULL JOIN B
ON A.PK = B.PK WHERE A.PK IS NULL OR B.PK IS NULL
返回结果

A.PKB.PKA.ValueB.Value
1NULLA1NULL
NULL6NULLB6
NULL7NULLB7

5.Cross Join( 交叉连接 )

功能:
返回两个表的笛卡尔积,即每个左表的行都与右表的每一行结合。

图解:
在这里插入图片描述

语法:

SELECT columns
FROM Table_A A
CROSS JOIN Table_B B;

结果:
包含两个表的所有可能行组合。

支持:

JoinTypeMysqlOracleHive
Cross Join

6. Self Join(自连接)

功能:
将表与自身连接。通常用于表中记录的比较。

图解:
在这里插入图片描述

语法:

SELECT A.column, B.column
FROM Table A A
JOIN Table A B
ON A.column = B.column;

结果:
返回表中满足条件的行对。

支持:

JoinTypeMysqlOracleHive
Self Join

7.Left Semi Join

功能:
返回左表中所有在右表中有匹配的记录。只返回左表的列。

图解:
在这里插入图片描述

语法:

SELECT columns
FROM Table_A A
LEFT SEMI JOIN Table_B B
ON A.column = B.column;

结果:
结果:只包含左表中有匹配的行。

支持:

JoinTypeMysqlOracleHive
Left Semi Join××

8.Anti Join(Anti Join,反连接)

功能:
返回左表中所有在右表中没有匹配的记录。

图解:
在这里插入图片描述

语法:

(通常通过 LEFT JOIN + WHERE 或 NOT EXISTS 实现)
SELECT columns
FROM Table_A A
LEFT JOIN Table_B B
ON A.column = B.column
WHERE B.column IS NULL;

结果:
只包含左表中没有匹配的行。

支持:

JoinTypeMysqlOracleHive
Anti Join××
  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值