Oracle的表连接分类:
1.内连接 (Inner Join)
2.外连接 (Outer Join)
分类:1).左外连接 (Left Outer Join)
2).右外连接 (Right Outer Join)
3).全外连接 (Full Outer Join)
3.自连接 (Self Join)
附图 SQL JOINS
一、内连接
t1表和t2表做内连接,连接条件:
SELECT t1.no,t2.no FROM t1 INNER JOIN t2 ON t1.coo=t2.coo;
SELECT t1.no,t2.no FROM t1,t2 WHERE t1.coo=t2.coo;
记录的匹配过程:
1.从t1表中读取第一条记录row1,假设它的coo列的值为1;
2.根据该值到t2表中查找匹配的记录,即需要遍历t2表。从t2表中的第一条记录row1开始,若该记录的coo列的值为1,
则这两条记录能够匹配上。t1表的row1和t2表的row1组合后,做为结果集里的一条记录。若匹配不上就不做组合,即被过滤掉;
3.依据第二步将t2表中的所有记录遍历一次,只要匹配就将匹配组合的结果放入到结果集中;
4.从t1表中读取第二条记录,依次重复第二步和第三步,产生最终的结果集。
记录的匹配有如下三种情况:
1.t1表的某条记录在t2表中找不到任何一条匹配的记录。那么t1表中的该记录不会出现在结果集中。
2.t1表的某条记录在t2表中只有一条匹配记录。那么t1表中的该记录和t2表中匹配的记录组成一条新记录出现在结果集中。
3.t1表的某条记录在t2表中有多条匹配记录。那么t1表中的该记录和t2表中每一条匹配的记录组成新记录出现在结果集中。
内连接的核心:一张表里的记录一定要在另一张表中找到匹配的记录,否则不能出现在结果集中。即内连接解决匹配的问题。
得到结果集记录的两种方式:
1).t1做驱动表,t2做匹配表;
2).t2做驱动表,t1做匹配表;
无论哪种方式最终得到的结果都一样,所不同的是效率。
二、外连接
2.0.假设t1表和t2表做外连接时的连接条件:
SELECT t1.no,t2.no FROM t1 LEFT OUTER JOIN t2 ON t1.coo=t2.coo;
t1做为驱动表,t2做匹配表(使用左外连接作为例子来讨论)。记录的匹配过程:
1.从t1表中读取第一条记录row1,若它的coo列的值为1;
2.根据该值到t2表中查找所有匹配的记录,即需要遍历t2表,从t2表中的第一条记录开始,若该记录row1的coo列值为1,
则这两条记录能够匹配上,那么t1的row1和t2的row1组合起来,做为结果集里的一条记录。若扫描完后,t1的row1记录在t2表中
找不到任何匹配的记录,t2表中将模拟一条null记录与t1表中的row1组合起来,放入结果集;
3.按照第二步依次将t2表中所有的记录检测一遍,只要匹配就放入结果集中;
4.从t1表中读取第二条记录,依次重复第二步和第三步,产生最终的结果集。
2.1.左外连接:
t1表、t2表做左外连接时的连接条件:
SELECT t1.no,t2.no FROM t1 LEFT OUTER JOIN t2 ON t1.coo=t2.coo;
SELECT t1.no,t2.no FROM t1,t2 WHERE t1.coo=t2.coo(+);
t1表做驱动表,t2表做匹配表。
结果集(左外连接)=内连接的结果集 + 驱动表中匹配不上的记录和一条null记录的组合。
外连接的核心:将匹配不上的记录显示出来。
2.2.右外连接:
t1表、t2表做右外连接时的连接条件:
SELECT t1.no,t2.no FROM t1 RIGHT OUTER JOIN t2 ON t1.coo=t2.coo;
SELECT t1.no,t2.no FROM t1,t2 WHERE t1.coo(+)=t2.coo;
t2做驱动表,t1做匹配表。
结果集(右外连接)=内连接的结果集 + 驱动表中匹配不上的记录和一条null记录的组合。
2.3.全外连接:
t1表、t2表做全外连接时的连接条件:
SELECT t1.no,t2.no FROM t1 FULL OUTER JOIN t2 ON t1.coo=t2.coo;
SELECT t1.no,t2.no FROM t1 LEFT JOIN t2 ON t1.coo=t2.coo UNION SELECT t1.no,t2.no FROM t1 RIGHT JOIN t2 ON t1.coo=t2.coo;
t2做驱动表,t1做匹配表。
结果集(全外连接)=内连接的结果集 + 驱动表、匹配表中匹配不上的记录和一条null记录的组合 。
注意:
若使用加号(+)来表示,+放在哪边就表示在哪边补空(null),即用+标识的表做为匹配表。不加+的表做为驱动表,
驱动表的记录都将出现在结果集中。
三、自连接
自连接:一张表当做多张表来用。
假设有一张学生表,包含学生的基本信息(学号、姓名、结对号等)。老师将学生结对,即一个成绩好的学生和一个成绩差
的学生组成一对。这样有利于学生各方面的成长。现在要查询学生的结对信息。但是只有一张学生表,已知结对号就是结对同学
的学号。使用自连接查询:
SELECT s.id,s.name,p.name FROM student s,student p WHERE s.partnerid=p.id;
四、其他连接
交叉连接(CROSS JOIN):产生笛卡尔积。一张表中的每一行和另一张表中的每一行组成一个结果集。
SELECT * FROM t1 CROSS JOIN t2;
自然连接(NATURAL JOIN):在两张表中寻找列名和数据类型都相同的字段,并自动将它们连接起来,返回符合条件的结果。
SELECT id,name FROM t1 NATURAL JOIN t2;
修订:
1.2014年11月20日,纠正错误的理解。
参考:
优快云博文、《Oracle9i SQL手册》
注: