日期:2014-05-16 浏览次数:20881 次
??? 外连接分为左外连接、右外连接、全外连接。对应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.(+)操作符不能与or和in操作符一起使用。
???5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。
? 内连接:
??
?? ??查询结果:相同的属性值才显示 ??----内连接,使用inner join 关键字
select * from outj1 inner join outj2 on outj1.o1_id=outj2.o2_id
??
?
?