Oracle数据表的左连接与右连接

http://www.cnblogs.com/LeoTerry/archive/2010/03/26/1696988.html

 

数据表的接连有:
1、内接连(自然连接): 只有多少个表相匹配的行才能在结果集中出现
2、外连接: 包括
(1)左外连接 (左侧的表不加限制)
(2)右外接连(右边的表不加限制)
(3)全外连接(左右两表都不加限制)
三、自连接(连接发生在一 张基表内)

sql规范语法:
select table1.column,table2.column
from table1 [inner | left | right | full ] join table2 on
table1.column1 = table2.column2;

inner join 代表内再三再四;left join表示左外连接;right
join代表右外接连;full join表示完全外接连;
on子句用于钦赐连接条件。注意,假若运用from子句钦赐内、外接连,则必须求选取on子句钦赐连接条件;
假诺利用(+)操作符钦命外接连,则必须运用where子句钦点连接条件。

假若主表的主键列和从表的外表键列名称一致,那么能够利用 natural join
关键字自动执行内接连操作。
select  dname,ename from dept natural join emp;

select a.studentno, a.studentname, b.classname
from students a, classes b
where a.classid(+) = b.classid;
STUDENTNO STUDENTNAM CLASSNAME


一 周虎     一年级一班
二 周林     一年级2班
一年级叁班
上述语句是右连接:
即”(+)”所在地点的另壹侧为连日来的势头,右连接表达 等号左边的具有
笔录均会被出示,无论其在左侧是还是不是拿走相配。也便是说上例中,无
论会不晤面世某些班级未有一个学员的状态,那几个班级的 名字都会在
查询结构中冒出。
反之:
select a.studentno, a.studentname, b.classname
from students a, classes b
where a.classid = b.classid(+);
STUDENTNO STUDENTNAM CLASSNAME


1 周虎     一年级一班
2 周林     一年级二班
3 钟林达
则是左连接,无论那几个学生有未有多少个能在2个班级中赢得相配的机构号,
那 个学生的记录都会被突显。
select a.studentno, a.studentname, b.classname
from students a, classes b
where a.classid = b.classid;
本条则是平时 用到的内接连,突显两表都符合条件的记录
总之,
左连接呈现左侧全体的和右侧与左侧相同的
右连接显示右侧全体的和左手与右手 相同的
内接连是只展现知足条件的! ……


补充:
利用(+)的注意事项:
1.(+)操作符只好出现在where子句中,并且不可能与outer join语法同时选择。
二.当使用(+)操作符执行外接连时,若是在where子句中含有有多少个标准,则必须在具有条件中都涵盖(+)操作符。
三.(+)操作符只适用于列,而不可能用在表明式上。
4.(+)操作符不可能与or和in操作符1起使用。
5.(+)操作符只可以用来落到实处左外连接和右外连接,而不可能用来落到实处完全外接连。
for example:
select a.dname,b.ename from dept a,emp b where a.deptno = b.deptno(+)
and b.deptno(+) = 10;

===============================

以下的小说首若是经过代码的措施来引出Oracle
join
的不易用法,其在骨子里中的应用比例依旧占为多数的,借使您对这一新开发的技术,心存好奇的话,以下的小说将会揭示它的心腹面纱。希望你在浏览完之后会具有收获。

  1. 8i:  
  2. create table dali.test1(a int,b int);  
  3. create table dali.test2(a int,b int);  
  4. insert into dali.test1 values(1,456);  
  5. insert into dali.test1 values(2,427);  
  6. insert into dali.test2 values(1,45456);  
  7. insert into dali.test2 values(3,45656);  

 

内连接

  1. select * from dali.test1 a, dali.test2 b where a.a=b.a; 

左连接

  1. select * from dali.test1 a, dali.test2 b where a.a=b.a(+); 

右连接

  1. select * from dali.test1 a, dali.test2 b where a.a(+)=b.a; 

完全连接

  1. select * from dali.test1 a, dali.test2 b where a.a=b.a(+)  
  2. union  
  3. select * from dali.test1 a, dali.test2 b where a.a(+)=b.a; 

迪卡尔

  1. select * from dali.test1, dali.test2;  
  2. ‘================================================================== 

9i和sqlserver一样 left join,right join,full join

 

分为1. INNER JOIN 2. LEFT JOIN 3. RIGHT JOIN 4.LEFT OUTER JOIN

第一设定三个我们要用的八个表

表A 表B

ID NAME ID CLASS

1 IBM 1 C1

2 SONY 3 C3

3 BMW 4 C4

1 INNER JOIN: SELECT * FROM A INNER JOIN B ON A.ID=B.ID

得表 ID NAME CLASS

1 IBM C1

3 BMW C3

对了 就是 三个表的ID都存在并同样 得到那八个表的组合表

2 LEFT JOIN : SELECT * FROM A LEFT JOIN B ON A.ID=B.ID

得表 ID NAME CLASS

1 IBM C1

2 SONY null

3 BMW C3

没晕吧 倘使还有方向感 就行 LEFT(左)
获得的是A(left语句的左边的表)的兼具记录 而B表对应的笔录未有的话也要补齐
(真霸道! 呵呵)

3 RIGHT JOIN : SELECT * FROM A RIGHT JOIN B ON A.ID=B.ID

得表 ID NAME CLASS

1 IBM C1

3 BMW C3

4 null C4

对了WranglerIGHT(右) 获得的是B(right语句的左侧的表)的享有记录
而A表对应的笔录没有的话也要补齐 (作者也翻身了! 呵呵)

4 FULL OUTER JOIN: SELECT * FROM A FULL OUTER JOIN B ON A.ID=B.ID

得表 ID NAME CLASS

1 IBM C1

2 SONY null

3 BMW C3

4 null C4

上述的相干内容便是对Oracle
join的用法的叙说,希望会给你带来1些扶植在此方面。


 

数据表的连续有: 
一、内接连(自然连接): 唯有八个表相相称的行才能在结果集中出现 
2、外连接: 包括 
(一)左外连接(右侧的表不加限制) 
(二)右外接连(右侧的表不加限制) 
(3)全外连接(左右两表都不加限制) 
3、自连接(连接发生在一张基表内) 

s**elect a.studentno, a.studentname,
b.classname 
  from students a, classes b 
  where a.classid(+) = b.classid;** 

STUDENTNO STUDENTNAM CLASSNAME 
———- ———- —————————— 
    一 周虎     一年级一班 
    二 周林     一年级贰班 
            一年级叁班 

以上语句是右连接: 
即”(+)”所在地方的另1侧为总是的来头,右连接表明等号右边的富有 
笔录均会被出示,无论其在左侧是还是不是获得相称。也正是说上例中,无 
论会不会现出某些班级未有1个学生的景况,那个班级的名字都会在 
询问结构中冒出。 

反之: 
select a.studentno,
a.studentname, b.classname 
  from students a, classes b 
  where a.classid = b.classid(+);
 

STUDENTNO STUDENTNAM CLASSNAME 
———- ———- —————————— 
    壹 周虎     一年级壹班 
    二 周林     一年级二班 
    3 钟林达 

则是左连接,无论那一个学生有未有一个能在一个班级中拿走相配的机关号, 
以此学生的记录都会被出示。 

select a.studentno,
a.studentname, b.classname 
  from students a, classes b 
  where a.classid = b.classid;
 

其一则是日常使用的内接连,显示两表都符合条件的记录 
总之, 
左连接展现右侧全体的和左侧与左边相同的 
右连接显示右侧全体的和左手与右手相同的 
内接连是只展现满足条件的!

相关文章