www.Orasql.Com
 
用户名: 密码:  验证码: 注册|找回密码 oracleawen's blog  
 
         当前位置 >> 技术论坛  发表帖子     论坛版块     查找帖子
基础知识系列--Oracle的连接-技术论坛||Oracle高手之路—Orasql.Com!
            基础知识系列--Oracle的连接
 
发贴人:wingsless
core_qq@126.com893286870
用户级别:普通会员
发贴总数:5
注册时间:2011-11-05 21:34:38
2012-02-26 15:22:15

 

    从今天开始我决定每周抽出一些空闲时间,记录一下Oracle的一些基础知识,也算是方便用baidu和google的人吧。

    今天介绍一个非常有数学气息的--连接。

    首先介绍我今天需要使用的两张表,test1和test2。test1是学生基本信息表,包括学生的名字和学号;test2是成绩表,有学生学号,成绩这两列。

    表的数据如下图:

    test1:

    test2:

     这两个表由stu_id进行关联。

     好了,现在介绍第一种连接形式:内连接。代码如下:

     

SELECT T1.STU_ID, T1.STU_NAME, T2.SCORE
  FROM TEST1 T1
 INNER JOIN TEST2 T2
    ON T1.STU_ID = T2.STU_ID;

      这中查询的结果是:

      很不幸,玄烨同学没去考试。因此查不出成绩来。但是我现在很想很想得到一张完全的成绩单,包括没去考试的玄烨同学,因为我要开家长会了,怎么办呢?这个时候就可以用到外连接:

      

SELECT T1.STU_ID, T1.STU_NAME, T2.SCORE
  FROM TEST1 T1
 LEFT OUTER JOIN TEST2 T2
    ON T1.STU_ID = T2.STU_ID;

      结果如下:

      

      这里的基本原理就是关系代数,可以参考《数据库系统概论》(王珊,萨师煊)第二章的内容。

      有左连接就有右连接。给test2增加几行,stu_id不在test1的记录。然后写这个SQL:

SELECT T1.STU_ID, T1.STU_NAME, T2.SCORE
  FROM TEST1 T1
 RIGHT OUTER JOIN TEST2 T2
    ON T1.STU_ID = T2.STU_ID;

       这样就取到了并不满足相等条件的test2中的记录,下图红框框中的:

       

       现在我想取到所有的,也就是说test1中没成绩的和test2中没有名字的记录,这个时候就要用到全外连接

SELECT T1.STU_ID, T1.STU_NAME, T2.SCORE
  FROM TEST1 T1
 FULL OUTER JOIN TEST2 T2
    ON T1.STU_ID = T2.STU_ID;

       得到的结果:

       

      还有种自然连接,平时我也不用,结果嘛,自己看吧。先看SQL:

      

SELECT STU_ID, STU_NAME, SCORE FROM TEST1 T1 NATURAL JOIN TEST2 T2;

      结果:

       

      我感觉这个和以下的SQL结果是一样的:

      

SELECT T1.STU_ID, T1.STU_NAME, T2.SCORE FROM TEST1 T1, TEST2 T2 WHERE T1.STU_ID = T2.STU_ID;

      也和第一个内连接的一样。自然连接还有好几种写法,这里就不一一介绍了,因为我平时工作也用不到,基本上不会,也就不抄书了。

 

      
 
  
 Orasql.Com|E-Mail:oracleawen@gmail.com|Phone:15271942915|Copyright © 2011|All Rights Reserved|