oracle

关注公众号 jb51net

关闭
首页 > 数据库 > oracle > oracle多表查询连接

oracle数据库超全的多表查询连接

作者:程序猿羊

这篇文章主要给大家介绍了关于oracle数据库超全的多表查询连接的相关资料,多表连接查询实际上是通过各个表之间公共字段的关键性来查询数据的,它是关系数据库查询的最主要的特征,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、简述 

1、两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列连接而建立起来的。用来连接两张表的表达式组成了连接条件。当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合结果集。

2)、有5种基本类型的的连接,inner,outer,natural,cross连接,自连接。

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子句指定连接条件。

二、说明与例子

2.1、内连接 inner join  

特点:只有满足条件的数据。和用select查询多表(使用where)是一样的效果,所以内连接用地很少。(inner join可简写为join)

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。 

1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复属性。(区别于自然连接)

2、不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!< 和 <>。 

teacher 和 student 表

select * from student s inner join teacher t 
on s.teacheid=t.teacheid;

select * from student s join teacher t 
on s.teacheid=t.teacheid;
--使用多表查询
select * from student s,teacher t 
where s.teacheid=t.teacheid;

结果:(注意结果中包含重复属性)

2.2、外连接 outer join  

特点:含有不满足条件的数据。

外连接,返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接或左连接))、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。

 1.left join(左连接)等价于(left outer join(左外连接))  返回包括左表中的所有记录和右表中连接字段相等的记录;(左表中所有记录+右表中满足条件的记录)

 2.right join(右连接)等价于(right outer join(右外连接))返回包括右表中的所有记录和左表中连接字段相等的记录;(右表中所有记录+左表中满足条件的记录)

 3. full join (全连接)等价于(full outer join(全外连接))查询结果等于左外连接和右外连接的和。

例子:

(1)、左连接(左外连接) left join

select * from student s left join teacher t 
on s.teacheid=t.teacheid;
或 
select * from student s ,teacher t where
s.teacheid=t.teacheid(+);

查询结果:包含student中的所有记录和满足条件的记录

(2)、右连接(右外连接) right join 

包含teacher中的所有记录和满足条件的记录。

select * from student sright join teacher t
on s.teacheid=t.teacheid;

或 select * from student s ,teacher t where
s.teacheid(+)=t.teacheid;

查询结果:

(3)、全连接(全外连接) full join

select * from student s full join teacher t 
on s.teacheid=t.teacheid;

输出:(两张表中的所有值)

对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:         

   1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。         

   2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符          

   3.(+)操作符只适用于列,而不能用在表达式上。         

   4.(+)操作符不能与or和in操作符一起使用。         

   5.(+)操作符只能用于实现左外连接(左连接)和右外连接(右连接),而不能用于实现完全外连接(全连接)。

   6、用(+)号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在右表,左表就是全部显示,故是左连接。

2.3、自然连接 natural join  

特点:所有数据类型和列名都相同的字段作为条件组成的结果集,不含on。自然连接不包含重复的属性

自然连接是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系。即自然连接是在两张表中寻找那些数据类型和列名都相同(所有)的字段,然后自动地将他们连接起来,并返回所有符合条件的结果。

select * from student natural join teacher;

分析:两个表中有两个相同属性,teacherid和deptno,不用加限定条件即按照这两个字段连接

结果:(注意deptno属性只有一个)

有关自然连接的一些注意事项:

   (1).如果做自然连接的两个表的有多个字段都满足有相同名称和类型,那么他们会被作为自然连接的条件。

   (2).如果自然连接的两个表字段名称相同,但数据类型不同,那么将会返回一个错误。

2.4、交叉连接(cross join)  

特点:不含on,返回两个表所有数据行的笛卡尔积。

交叉连接不带on子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 (5*5)

select * from student cross join teacher;
等价于:select * from student,teacher;

2.5、自连接(自己连接)  

连接的表是同一张表,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。

用途举例:计算公交链路换乘问题(见eg2)

select  s1.*, s2.* from student s1 , student s2 
where s1.depino=s2.depino 
and s1.classno=s2.classno;

2.6 多表查询  

select * from student s,teacher t where
s.teacheid=t.teacheid;

特点:多张表在一起,使用where作为查询条件关键字。

2.7 子查询  

select * from student s where 
s.teacheid in(select teacheidfrom teacher);

总结

到此这篇关于oracle数据库超全的多表查询连接的文章就介绍到这了,更多相关oracle多表查询连接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文