oracle连接总结(内连接、外连接、自然连接,交叉连接,自连接)
1) 两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的。用来连接两张表的表达式组成了连接条件。当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合结果集
2) 有5种基本类型的的连接,inner,outer,natural,cross连接,自连接。
2.说明与例子
1)内连接 (inner join (可简写为join))
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列, 包括其中的重复属性。 (区别于自然连接)
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的 列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
teacher 和 student 表
![](http://img2.tuicool.com/7Fjmie.png)
![](http://img2.tuicool.com/YVvqMv.png)
eg1:等值连接:
SELECT S.*, T.* FROM STUDENT S INNER JOIN TEACHER T ON S.TEACHERID = T.ID; //注意oracle重命名table 不能加as只需加空格即可,as可用于重命名列
结果:(注意结果中包含重复属性,重复的属性结果中重命名了)
eg2:
SELECT * FROM STUDENT JOIN TEACHER ON STUDENT.DEPTNO= TEACHER.DEPTNO;
2)自然连接(natural join)
自然连接是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系。
即 自然连接是在两张表中寻找那些数据类型和列名都相同的字段(无论有几个),然后自动地将他们连接起来,并返回所有符合条件按的结果。
SELECT STUDNET.CLASSID,TEACHER.DEPTNO FROM STUDENT NATURAL JOIN TEACHER;
报错:(不能加限定条件)
SQL 错误: ORA-25155: NATURAL 联接中使用的列不能有限定词 25155. 00000 - "column used in NATURAL join cannot have qualifier" *Cause: Columns that are used for a named-join (either a NATURAL join or a join with a USING clause) cannot have an explicit qualifier. *Action: Remove the qualifier.
eg2:
SELECT * FROM STUDENT NATURAL JOIN TEACHER;
分析:两个表中有两个相同属性,TEACHERID和DEPTNO,不用加限定条件即按照这两个字段连接
结果:(注意deptno属性只有一个)
下面对比使用inner join的结果:(包含重复属性,并且包含重复行)
SELECT * FROM STUDENT JOIN TEACHER ON STUDENT.DEPTNO= TEACHER.DEPTNO;
3) 外连接 (outer join)
外连接,返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接或左连接))、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。
1.left join(左联接)等价于(left outer join) 返回包括左表中的所有记录和右表中联结字段相等的记录;
2.right join(右联接)等价于(right outer join) 返回包括右表中的所有记录和左表中联结字段相等的记录;
3. full join (全连接)等价于(full outer join)查询结果等于左外连接和右外连接的和;
eg1:
SELECT S.*, T.* FROM STUDENT S LEFT JOIN TEACHER T ON S.CLASSNO = T.CLASS;
输出结果:(包含student中的所有记录和满足条件的记录)
eg2:
SELECT S.*, T.* FROM STUDENT S RIGHT JOIN TEACHER T ON S.CLASSNO = T.CLASS;
结果:
SELECT S.*, T.* FROM STUDENT S FULL JOIN TEACHER T ON S.CLASSNO = T.CLASS;
输出:(因为teacher中有的对应student中都有,所以结果和left join相同)
![](http://img1.tuicool.com/y2AzInJ.png)
4) 交叉连接(cross join)
交叉连接不带ON子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到 结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查 询条件的数据行数。
SELECT S.*, T.* FROM STUDENT S CROSS JOIN TEACHER T ;
等价于:
SELECT S.*, T.* FROM STUDENT S , TEACHER T ;
输出结果:
5)自连接
连接的表是同一张表,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。
用途举例:计算公交链路换乘问题(见eg2)
eg1:
SELECT S1.*, S2.* FROM STUDENT S1 , STUDENT S2 WHERE S1.DEPTNO=S2.DEPTNO AND S1.CLASSNO=S2.CLASSNO;
结果:
eg2:
table route(num, company, pos, stop)
SELECT * FROM route R1, route R2 WHERE R1.stop=R2.stop;
可查询公用同一公交车站的所有路线
3.总结
1)即使是在连接条件不满足的情况下,外部连接也会在结果集内返回行,而内部连接不会在结果集类返回行 当外部连接不满足连接条件时,通常返回一个表中的列,但是第二个表中没有返回值--为null
2)自然连接不包含重复的属性
3)交叉连接是两个表数据笛卡尔积(相当于不加连接条件)