最近使用ODI,其中有一个JOIN组件涉及到常见的几种JOIN类型,因此整理了下交叉连接和自然连接的区别.
一、概述
两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的。用来连接两张表的表达式组成了连接条件。当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合结果集
二、连接类型及例子
有4种基本类型的连接,inner,outer,natural,cross连接
2.1内连接 (inner join =join )
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。
----- 内连接
SELECT * FROM A INNER JOIN B ON A.PERSON_ID= B.PERSON_ID;
2.2外连接 (outer join)
外连接,返回到查询结果集合中不仅包含符合连接条件的行,而且还包括左表(左外连接或左连接))、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。
1. left join(左联接)等价于(left outer join) 返回包括左表中的所有记录和右表中联结字段相等的记录;
-左连接
SELECT * FROM A LEFT JOIN B ON A.PERSON_ID= B.PERSON_ID;
--Oracle9i以前版本中左连接的写法如下:
SELECT * FROM A , B where A.PERSON_ID= B.PERSON_ID(+);
2. right join(右联接)等价于(right outer join)返回包括右表中的所有记录和左表中联结字段相等的记录;
---外连接种的右连接
SELECT * FROM A RIGHT JOIN B ON A.PERSON_ID= B.PERSON_ID;
---Oracle9i以前版本中左连接的写法如下:
SELECT * FROM A , B where A.PERSON_ID(+)= B.PERSON_ID;
3. full join (全连接)等价于(full outer join)查询结果等于左外连接和右外连接的和
----Full Join
SELECT * FROM A FULL JOIN B ON A.PERSON_ID= B.PERSON_ID;
2.3自然连接(natural join)
自然连接是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系。即自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。自然连接不包含重复的属性. 自然连接是通过对参与表关系中所有同名的属性对取等(即相等比较)来完成的,故无须自己添加连接条件
SELECT A.PERSON_ID FROM A NATURAL JOIN B ;
SQL 错误: ORA-25155: NATURAL 联接中使用的列不能有限定词
----自然连接
SELECT * FROM A NATURAL JOIN B ;
2.4交叉连接(cross join)
交叉连接不带ON子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
---交叉连接
SELECT * FROM A CROSS JOIN B ;
附:
CREATE TABLE "SCOTT"."A" (
"PERSON_ID" NUMBER(5) NULL ,
"PERSON_NAME" VARCHAR2(255 BYTE) NULL
)
;
-- ----------------------------
-- Records of A
-- ----------------------------
INSERT INTO "SCOTT"."A" VALUES ('1', '张三');
INSERT INTO "SCOTT"."A" VALUES ('2', '李四');
INSERT INTO "SCOTT"."A" VALUES ('3', '王五');
INSERT INTO "SCOTT"."A" VALUES ('4', '赵六');
INSERT INTO "SCOTT"."A" VALUES ('5', '周七');
CREATE TABLE "SCOTT"."B" (
"PERSON_ID" NUMBER(5) NULL ,
"LOVE_FRUIT" VARCHAR2(255 BYTE) NULL
);
-- ----------------------------
-- Records of B
-- ----------------------------
INSERT INTO "SCOTT"."B" VALUES ('1', '香蕉');
INSERT INTO "SCOTT"."B" VALUES ('2', '苹果');
INSERT INTO "SCOTT"."B" VALUES ('3', '橘子');
INSERT INTO "SCOTT"."B" VALUES ('4', '梨');
INSERT INTO "SCOTT"."B" VALUES ('8', '桃');