Oracle语法:内连接、外连接和全连接
Oracle中的连接可分为,内连接(inner join)、外连接(outer join)、全连接(full join),不光是Oracle,其他很多的数据库也都有这3种连接查询方式。
演示数据准备
创建一个部门表(DEPT)和一个员工表(EMPLOYEE)。
1 | create table DEPT |
两个表增加如下几条测试数据。
内连接(inner join)
内连接是最常用的查询方式,比如 select * from A inner join B on A.field1=B.field2,这个查询语句也可以写成select * from A,B where A.field1=B.field2这种方式,内连接的查询结果是两个表的交集部分。
1 | select * from dept inner join employee on dept.deptid=employee.deptid; |

外连接(outer join)
外连接(outer join)可分为左外连接left outer join和右外连接right outer join,其中outter可以省略,直接写成left join和right join。其中left join是结果集中保留全部前表的数据,right join是结果集中保留全部后表的数据。
左外连接(left join)
1 | select * from dept left outer join employee on dept.deptid=employee.deptid; |

右外连接(right join)
1 | select * from dept right outer join employee on dept.deptid=employee.deptid; |

全连接(full join)
全连接的查询结果是两个表的并集,并且去除重复的部分。当 A 表 中有 10 条数据,B 表中有 3 条数据,其中通过关联条件关联有 1 条关联成功。那么,我们通过full join 进行关联将出现 10 + 3 - 1 条数据。 (A,B表数据的和减去了关联成功的重复记录就是最后的结果集,其最终效果结是将两张表的数据完全结合到了一起。)
1 | select * from dept full join employee on dept.deptid=employee.deptid; |

full join using(…)
full join using(…) 中 using 里的字段其实就是关联条件中 on 的字段,只不过是用两个表中都要有 using 里的列名。并且结果列中,不需要指定是A表的列还是B表的列,如果结果集中A、B表的该列的结果都不为空,则取任意一个表的列,如果只有一个表中的列的结果不为空,则会取这个非空值。
下面给一个示例来进一步体会,先准备测试数据。
1 | SELECT * FROM t_Data_Export_Temp; |
对 YF 字段使用 using 来匹配。
1 | SELECT YF,A.KHH,B.KHXM |

上面这个写法的等价写法为:
1 | SELECT NVL(A.YF,B.YF) YF,A.KHH,B.KHXM |
如果使用另外一个两表都为空的列来关联呢?
1 | SELECT FLAG,A.YF,A.KHH,B.KHXM |
结果还是一个并集: