最近使用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', '桃');

最新文章

  1. C++ string和wstring互转实现
  2. 项目启动异常java.lang.OutOfMemoryError: PermGen space
  3. Redis 3.2.100 Windows 32位下载
  4. TP隐藏入口
  5. 109、FragmentPagerAdapter与FragmentStatePagerAdapter区别
  6. MSSQL 2005数据库与SP4补丁安装
  7. 一个非常标准的Java连接Oracle数据库的示例代码
  8. TOAD Menu Shortcuts 快捷键
  9. O(n)线性时间找第K大,中位数
  10. MCMC,GIBBS SAMPLING简单摘要
  11. DP题目推荐合集(洛谷/UVa)
  12. 蓝桥第八届省赛 javaB组承压计算
  13. 测试常用Linux命令总结
  14. Linux内核中Makefile、Kconfig和.config的关系(转)
  15. Java远程调用原理DEMO
  16. Centos7安装Splash
  17. 【Python】【有趣的模块】tqdm | inspect
  18. C#基础知识回顾--委托事件
  19. hadoop 2.2搭建常见错误
  20. Heavy Transportation---poj1797

热门文章

  1. Android 代码实现应用强制装到手机内存
  2. 【转】各种 NoSQL 的比较
  3. [转]微信JSAPI 微信内置JSAPI 2015年1月官方正式API接口,分享完整实例
  4. 利用Microsoft.Exchange.WebServices处理Office365邮件的几个属性
  5. Xilinx FFT IP v9.0 使用
  6. 一种模块化开发的目录结构和部署tips
  7. vue组件的hover事件模拟、给第三方组件绑定事件不生效问题
  8. Octave环境的安装
  9. php7安装mongoDB扩展
  10. 【Scala】Scala学习资料