基础知识系列--Oracle的连接

    从今天开始我决定每周抽出一些空闲时间,记录一下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;

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

     

posted @ 2012-02-25 20:46  wingsless  阅读(581)  评论(0编辑  收藏  举报