1. Inner Join(Join , 内连接)
功能:
返回两个表中都有的记录信息
也称之为自然连接
inner可以省略,inner join = join
图解:
语法:
SELECT columns FROM Table_A A INNER JOIN Table_B B ON A.column = B.column;
结果:
仅包含两个表中匹配的行。
支持:
JoinType | Mysql | Oracle | Hive |
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。
支持:
JoinType | Mysql | Oracle | Hive |
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
PK | Value |
1 | A1 |
2 | A2 |
3 | A3 |
4 | A4 |
5 | A5 |
Table B
PK | Value |
2 | B2 |
3 | B3 |
4 | B4 |
6 | B6 |
7 | B7 |
通过
A LEFT JOIN B
ON A.PK = B.PK WHERE B.PK IS NULL
返回结果
A.PK | B.PK | A.Value | B.Value |
1 | NULL | A1 | NULL |
5 | NULL | A5 | NULL |
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。
支持:
JoinType | Mysql | Oracle | Hive |
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
PK | Value |
1 | A1 |
2 | A2 |
3 | A3 |
4 | A4 |
5 | A5 |
Table B
PK | Value |
2 | B2 |
3 | B3 |
4 | B4 |
6 | B6 |
7 | B7 |
通过
A RIGHT JOIN B
ON A.PK = B.PK WHERE A.PK IS NULL
返回结果
A.PK | B.PK | A.Value | B.Value |
NULL | 6 | NULL | B6 |
NULL | 7 | NULL | B7 |
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。
支持:
JoinType | Mysql | Oracle | Hive |
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
PK | Value |
1 | A1 |
2 | A2 |
3 | A3 |
4 | A4 |
5 | A5 |
Table B
PK | Value |
2 | B2 |
3 | B3 |
4 | B4 |
6 | B6 |
7 | B7 |
通过
A FULL JOIN B
ON A.PK = B.PK WHERE A.PK IS NULL OR B.PK IS NULL
返回结果
A.PK | B.PK | A.Value | B.Value |
1 | NULL | A1 | NULL |
NULL | 6 | NULL | B6 |
NULL | 7 | NULL | B7 |
5.Cross Join( 交叉连接 )
功能:
返回两个表的笛卡尔积,即每个左表的行都与右表的每一行结合。
图解:
语法:
SELECT columns FROM Table_A A CROSS JOIN Table_B B;
结果:
包含两个表的所有可能行组合。
支持:
JoinType | Mysql | Oracle | Hive |
Cross Join | √ | √ | √ |
6. Self Join(自连接)
功能:
将表与自身连接。通常用于表中记录的比较。
图解:
语法:
SELECT A.column, B.column FROM Table A A JOIN Table A B ON A.column = B.column;
结果:
返回表中满足条件的行对。
支持:
JoinType | Mysql | Oracle | Hive |
Self Join | √ | √ | √ |
7.Left Semi Join
功能:
返回左表中所有在右表中有匹配的记录。只返回左表的列。
图解:
语法:
SELECT columns FROM Table_A A LEFT SEMI JOIN Table_B B ON A.column = B.column;
结果:
结果:只包含左表中有匹配的行。
支持:
JoinType | Mysql | Oracle | Hive |
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;
结果:
只包含左表中没有匹配的行。
支持:
JoinType | Mysql | Oracle | Hive |
Anti Join | × | × | √ |