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 wheres.teacheid=t.teacheid(+);

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

oracle-超全的多表查询连接_第1张图片

         

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

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

select * from student sright join teacher ton s.teacheid=t.teacheid;
或 select * from student s ,teacher t wheres.teacheid(+)=t.teacheid;

查询结果:

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

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

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

oracle-超全的多表查询连接_第2张图片

         

  对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:         
   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 wheres.teacheid=t.teacheid;

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

         

2.7 子查询  

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

   更多优秀文章,请扫码关注个人微信公众号或搜索“程序猿小杨”添加。

你可能感兴趣的:(Oracle,oracle,数据库,sql)