多表查询连接
一、 多表查询外连接的方式:
(+) 号 外连接
Inner join 内连接
Left outer join --outer 可以省略 外连接
Right outer join
Full outer join
用(+)的语法简洁,容易读懂,但只是ORACLE支持,LEFT JOIN是通用的,其它没有差别
二、 连接的作用:
实例:
create table out_join1(
id_1 varchar2(20),
name_1 varchar2(25)
)
create table out_join2(
id_2 varchar2(20),
name_2 varchar2(25)
)
insert into out_join1 values('1','daniel');
insert into out_join1 values('3','justin');
insert into out_join1 values('5','william');
insert into out_join1 values('6','demon');
insert into out_join1 values('7','david');
insert into out_join2 values('1','c_daniel');
insert into out_join2 values('2','irs');
insert into out_join2 values('3','c_justin');
insert into out_join2 values('4','linda');
insert into out_join2 values('5','c_william');
l 简单的等值连接 称为内连接 取两个表相同的记录
select id_1,id_2 from out_join1 ,
out_join2 where id_1=id_2
select id_1,id_2 from out_join1
inneer join out_join2 on id_1=id_2
结果集为:1,3,5
含义:取id_1=id_2的所有值
l 左连接:使用左连接 和 left join 结果集是相同的
select id_1,id_2, from out_join1 ,
out_join2 where id_1=id_2(+)
select id_1,id_2, from out_join1 left join
out_join2 on id_1=id_2
结果都为
含义:右条件所在的表必须严格进行相等连接条件的匹配,而左条件所在的表除了匹配相等连接条件外,还可以显示无法匹配连接条件的数据!
也称为左外连接。
l 右连接:使用左连接 和 right join 结果集是相同的
select id_1,id_2, from out_join1 ,
out_join2 where id_1(+)=id_2
select id_1,id_2 from out_join1 right join
out_join2 on id_1=id_2
结果集为:
含义:左条件所在的表必须严格进行相等连接条件的匹配,而右条件所在的表除了匹配相等连接条件外,还可以显示无法匹配连接条件的数据!
也称为右外连接.
l FULL OUTER JOIN:全外关联
select id_1,id_2,name_1,name_2 from out_join1 full join
out_join2 on id_1=id_2
结果集为:
含义: 取 两个表的所有记录
三、 外连接的注意事项:
1)你不可以在查询块中使用(+) 当它同时包含 join的from语句中
2)(+)只是在where语句中,并且只能对应一个表或视图的一行字段
3)如果A和B做联接时有多个条件,那么(+)必须完善所有的匹配条件,
如果没有 ,oracle不会警告你~只是结果自然不同的
4)不可以在作出一个表外查询 另张表内查询的(+)联接操作~~
5)不可以用(+)外联接到自己 当然Self Join是可以的
6)含(+)的Where后的注意含(+)的Where后的注意OR不可用
IN不可用 子查询不可用
7) (+)是单向的 a(+)=b(+) 是错误的 可以使用 full join
总结
现在的Outer Join方法是Oracle9i时开始引用的 ANSI标准的联接语法,现在的则比较直观 简单
通过上边Full Join的实现方式 不难看到ANSI的联接语法要比用含Union的(+)的执行效率更高
如果是 三个表关联,必须有两个关联条件 n 表关联必须有n-1个条件