danielhjd 发表于 2013-1-26 13:38:04

(笔记)oracle中的join的整理和结构分析

在Oracle中的join主要分为:外连接(outter join),内连接(inner join),自身连接(self-join)
 
外连接(outter join)又分为左外连接(left outer join)、右外连接(right outer join)、全外连接(full outer join)。在sql语句(structured Query Language)是:table_1 left/right/full outer join table_2,通常我们省略outer。
    
下面利用一个例子说明数据库的外连接问题:
一:创建两张表out_join1 and out_join2并插入相应的数据:
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'); 
 out_join1 & out_join2的数据如下:

http://dl.iteye.com/upload/attachment/489681/db5c4f50-097b-39e8-8271-caa631618219.jpghttp://dl.iteye.com/upload/attachment/489683/089b4798-ca9b-3fd0-9e94-649ad83d78be.jpg
 
左外连接(left outer join)
select * from out_join1 left outer join out_join2 on out_join1.id_1=out_join2.id_2   -- 注意此处的on关键字select * from out_join1,out_join2 where out_join1.id_1=out_join2.id_2(+)               --注意此处的where关键字和(+)符号 结果如下:
 
http://dl.iteye.com/upload/attachment/489685/33a89a6c-f462-35ea-a0ae-3f653099b091.jpg
 
 
详细解释:
第一条查询语句和第二条查询语句的的意义是一样的,只是表达方式不同。table_1 left outer join table_2 on table_1.id = table_2.id,是以table_1的id号的index基础进行连接,table_2中有与table_1中id相同的进行配对。table_2中没有配对到的则null表示;
 
注意:由于此处的id具有unique所以不会出现一对多的关系,如果出现一对多的关系则显示结果会怎么样了...
 
右外连接(right outer join)
select * from out_join1 right outer join out_join2 on out_join1.id_1=out_join2.id_2select * from out_join1,out_join2 where out_join1.id_1(+)=out_join2.id_2 结果如下:
第一个条件查询的结果:                                        第二个条件查询的结果:
http://dl.iteye.com/upload/attachment/489687/a5b511f6-9f78-338d-94f4-f0f1c2007ea4.jpghttp://dl.iteye.com/upload/attachment/489689/67021836-18b7-32ef-bafb-f57ff8654411.jpg
 
详细解释:
第一条查询语句和第二条查询语句的的意义是一样的,只是表达方式不同。table_1 right outer join table_2 on table_1.id = table_2.id,是以table_2的id号的index基础进行连接,table_1中有与table_2中id相同的进行配对。table_1中没有配对到的则null表示; 当然最后你会发现显示的结果的结构不相同,那是因为他们的查询的机理不同。

 
 全外连接(full outer join)
select * from out_join1 full join out_join2 on out_join1.id_1=out_join2.id_2 结果如下:
http://dl.iteye.com/upload/attachment/489691/969edef4-d72f-3e3a-b2ce-a2ca5795ec57.jpg
 
 
详细解释:
在full连接中按照以表table_1的id和table_2的id号为基础进行匹配....有的这连接在一起,没有的则null表示。table_1在前...
 
(+)的用法:
    1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
   2. 当使用(+)操作符执行外连接时,如果在where子句中包含多个条件,必须在所有条件中包含(+)操作符
   3.(+)操作符只适用于列,而不能用在表达式上。
   4.(+)操作符不能与or和in操作符一起使用。
   5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。

内连接(inner join)
select * from out_join1 inner join out_join2 on out_join1.id_1=out_join2.id_2 结果:
 

http://dl.iteye.com/upload/attachment/489695/d1f43a1d-8bde-3f02-8526-fd259cbb134d.jpg
 
详细解释:
相同的属性值才显示,这里指的是tabel_1.id = table_2.id相同的显示
 
自身连接(self join)
select * from out_join1 c1,out_join1 c2 where c1.id_1 = c2.id_1 
结果如下:

http://dl.iteye.com/upload/attachment/489697/034f2ef4-2661-3770-ba22-3048d92bbb6e.jpg
 
自然连接(nature join)
select * from out_join2,out_join1 where out_join2.id_2=out_join1.id_1 结果如下:

http://dl.iteye.com/upload/attachment/489695/d1f43a1d-8bde-3f02-8526-fd259cbb134d.jpg
 
分析:同inner连接
 
 
页: [1]
查看完整版本: (笔记)oracle中的join的整理和结构分析