基础知识系列--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;
也和第一个内连接的一样。自然连接还有好几种写法,这里就不一一介绍了,因为我平时工作也用不到,基本上不会,也就不抄书了。