日期:2014-05-16  浏览次数:20860 次

外连接outer join

??? 外连接分为左外连接、右外连接、全外连接。对应sql语句是:table 1 left/right/full outer join table2,通常我们省略outer。

?? ?利用一个例子说明数据库的外连接问题:

??? 首先建2张表,outj1和outj2,分别只有2个字段:

create table outj1(
       o1_id  varchar2(4),
       o1_name varchar2(10)
)

?

create table outj2(
       o2_id  varchar2(4),
       o2_name varchar2(10)
)

????向2个表里插入一些数据:

???

insert into outj2 values('3','另一个3')
select * from outj1
select * from outj2

???

??? outj1的数据为:
???
???

??? ?outj2的数据为:
???
?

??? outj1为左表,outj2为右表:

???

----左外连接(outj1为左表,outj2为右表)
select * from outj1 left outer join outj2 on outj1.o1_id=outj2.o2_id --注意这里是用on关键字
select * from outj1,outj2 where outj1.o1_id = outj2.o2_id(+); --注意这里是用where关键字,+位置

??? 左外连接结果:?左表的所有行记录都显示,右表中id(条件)相同的元组显示,不匹配的为null
???
?

----右外连接
select * from outj1 right outer join outj2 on outj1.o1_id=outj2.o2_id
select * from outj1,outj2 where outj1.o1_id(+) = outj2.o2_id;    

????右外连接结果:右表的所有行记录都显示,左表中id(条件)相同的元组显示,不匹配的为null
???
?

----全外连接
select * from outj1 full outer join outj2 on outj1.o1_id=outj2.o2_id 
select * from outj1,outj2 where outj1.o1_id(+) = outj2.o2_id(+);  --错误的写法

??? 全外连接结果:左右两表的所有元组都显示,相同id(条件)的在一行上,不同id(条件)单独显示,不匹配的为null
???
?

??? (+)的用法:

??? 1.+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
???2.
当使用(+)操作符执行外连接时,如果在where子句中包含多个条件,必须在所有条件中包含(+)操作符
???3.
+)操作符只适用于列,而不能用在表达式上。
???4.
+)操作符不能与orin操作符一起使用。
???5.
+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。

? 内连接:

??

----内连接,使用inner join 关键字
select * from outj1 inner  join outj2 on outj1.o1_id=outj2.o2_id 

??

??查询结果:相同的属性值才显示

??
??
?

?