浅谈之表连接类型
oracle数据库中的表连接分为内连接和外连接两种类型,表连接的类型会直接决定表连接的结果。
1.内连接(inner join)是指表连接的连接结果只包含那些完全满足连接条件的记录。对于包含表连接的目标sql而言,只要其where条件中没有写那些标准sql中定义或者oracle中自定义的表示外连接的关键字,则该sql的连接类型就是内连接。
写法:目标表1 inner join 目标表2 on (连接条件)
或
目标表1 inner join 目标表2 using (连接列集合)
2.外连接(outer join)是对内连接的一种扩展,是指表连接的连接结果除了包含那些完全满足连接条件的记录之外还会包含驱动表中所有不满足该连接条件的记录。标准sql中的外连接分为左连接(left join)、右连接(right join)、全连接(full join)。
左连接写法:目标表1 left join 目标表2 on (连接条件)
或
目标表1 left join 目标表2 using (连接列集合)
这里是目标表1作为驱动表,目标表2 为被驱动表,此时的连接结果除了包含目标表1和目标表2中所有满足该连接条件的记录外,还会包含驱动表中所有不满足条件的记录,驱动表中所有不满足该连接条件的记录所对应的被驱动表中的查询列均会以null值来填充。
右连接写法:目标表1 right join 目标表2 on (连接条件)
或
目标表1 right join 目标表2 using (连接列集合)
这里是目标表2作为驱动表,目标表1为被驱动表,此时的连接结果除了包含目标表1和目标表2中所有满足该连接条件的记录外,还会包含驱动表中所有不满足条件的记录,驱动表中所有不满足该连接条件的记录所对应的被驱动表中的查询列均会以null值来填充。
全连接写法:目标表1 full join 目标表2 on (连接条件)
或
目标表1 full join 目标表2 using (连接列集合)
此时的连接结果除了包含目标表1和目标表2中所有满足该连接条件的记录外,还会包含目标表1和目标表2中所有不满足该链接条件的记录,同时,目标表1和目标表2中所有不满足该连接条件的记录所对应的另外一个表中的查询列均会以null值来填充。可以简单的把全连接理解成是先做左连接,再做右连接,最后对左连接和右连接的连接结果做一个union操作(注意,虽然可以这么理解,但是oracle实际执行全连接是不会这么做,比如union会对查询结果进行排序,但是union就不会)。
对于外连接而言,除了表连接条件之外的额外限制条件在目标sql的sql文本中所处的位置可能会影响该sql的实际执行结果。
我们来做测试:
执行下面查询语句:
范例1.
范例2.
在范例1中,限制条件t1.col1=1 会在表t1和t2做右连接之前就被应用在t1,即参与右连接的t1中的数据时那些满足条件t1.col1=1的记录;
在范例2中,限制条件t1.col1=1是在表t1和t2做右连接之后才会被应用在表t1和t2的连接结果集上,即参与右连接的t1中的数据是t1的所有数据。
和标准sql里表示外连接的语法不同,oracle用自定义的关键字(+)来表示外连接。关键字的位置在目标sql连接条件中某一个表的连接列的后面,含义是在哪个表的连接列后面,就表明哪个表以null值来填充那些不满足条件并位于该表中的查询列,此时应该以关键字对面的表作为外连接的驱动表。