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 | × | × | √ |