Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)Oracle连接查询有3种:交叉连接、内连接、外连接。交叉连接结果是其他连接结果的超集,外连接结果是内连接结果的超集。接下的例子以departments_v、employees_v两个视图数据为例(4条部门数据,9条人员数据)1.交叉连接:又称笛卡尔积连接,是两个或多个表间的无条件连接,因此它会将表1的每一条数据与表2的每一条数据连接,因此结果会有4*9=36条数据

大家好,又见面了,我是你们的朋友全栈君。

Oracle连接查询有3种:交叉连接、内连接、外连接。

交叉连接结果是其他连接结果的超集,外连接结果是内连接结果的超集。

接下的例子以departments_v、employees_v两个视图数据为例(4条部门数据,9条人员数据)

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

1.交叉连接:又称笛卡尔积连接,是两个或多个表间的无条件连接,因此它会将表1的每一条数据与表2的每一条数据连接,因此结果会有4*9=36条数据

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

2.内连接:根据指定的连接条件进行连接查询,因此满足连接条件的数据才会出现在结果集。

两个表进行内连接查询时,先找到表1的第一条记录,然后从头到尾扫描表2,将符合连接条件的记录与表1第一条记录连接成结果;

当表2扫描一遍后,再从表1的第二条记录开始,从头到尾扫描表2,将符合连接条件的与表1第二条记录连接成结果…

:

直至表1中所有记录处理完毕为止。

Oracle中,内连接的两种写法如下图

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

3.外连接:内连接的基础上,将某个连接表不符合连接条件的记录加入结果集。

Oracle中,左外连接、右外连接均有两种连接方式。

⑴先看标准SQL语句连接方式

【左外连接】在内连接基础上,将连接操作符左侧表不符合连接条件的记录加入结果集中,右侧表则用null填充。(个人觉得这更适合解释标准SQL语句的连接方式)

下图为【dept表 left join emp表】此时可以把dept表为基准,连接条件为两表部门号相同且部门号为10;

左侧表dept 10号部门的记录 与右侧表emp 10号部门的员工记录 满足连接条件,因此加入结果集;

左侧表dept 20号部门的记录 与右侧表emp 20号部门的员工记录 不满足连接条件,但该查询为左连接,因此会把左侧表dept20号部门的记录加入结果集,右侧表则null填充;

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

下图为【emp表 left join dept表】 可按着上面的情况分析

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

【右外连接】在内连接基础上,将连接操作符右侧表不符合连接条件的记录加入结果集中,左侧表则用null填充。(个人觉得这更适合解释标准SQL语句的连接方式)

【下图为dept表right join emp表】此时可以把emp表为基准,连接条件为两表部门号相同且部门号为10;

右侧表emp 10号部门的员工记录 与左侧表dept 10号部门的记录 满足连接条件,因此加入结果集;

右侧表emp 20号部门的员工记录 与左侧表dept  20号部门的记录 不满足连接条件,但该查询为右连接,因此会把右侧表emp 20号部门的员工记录加入结果集,左侧表则null填充;

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

【下图为emp表right join dept表】可按着上面的情况分析

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

⑵Oracle扩展的连接方式

【下图为dept(+)emp】(右外连接)

【右外连接】在内连接基础上,将连接操作符右侧表不符合连接条件的记录加入结果集中,左侧表则用null填充。

因此可以解析为:连接条件等号哪边的表用null填充,哪边表的列均用(+),另一边的表则会将不符合连接条件的记录加入结果集,如下图的emp表

交换表的顺序为employees_v emp, departments_v dept(此时称为左外连接),但结果一样,只不过结果的列顺序也交换过来,为EMPLOYEE_ID、FIRST_NAME、DEPARTMENT_ID、 DEPARTMENT_ID、DEPARTMENT_NAME

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

【下图为dept emp(+)】(左外连接)

【左外连接】在内连接基础上,将连接操作符左侧表不符合连接条件的记录加入结果集中,右侧表则用null填充。

因此可以解析为:连接条件等号哪边的表用null填充,哪边表的列均用(+),另一边的表则会将不符合连接条件的记录加入结果集,如下图的dept表

交换表的顺序为employees_v emp, departments_v dept(此时称为右外连接),但结果一样,只不过结果的列顺序也交换过来,为EMPLOYEE_ID、FIRST_NAME、DEPARTMENT_ID、 DEPARTMENT_ID、DEPARTMENT_NAME

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

!!!若dept表的列需全加(+),却如下图那样,则不会起作用,仅仅如内连接查询般。

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

4.全外连接:内连接的基础上,将连接操作符两侧表不符合连接条件的记录加入结果集。

全外连接只有标准SQL语句的连接方式表示。

分析:将满足条件的记录选出,再将一侧emp表中不满足连接条件的记录加入结果集,最后将另一侧dept表中不满足连接条件的记录加入结果集。

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

下图为去掉一个条件,分析可按照上图情况推理。

比同样连接条件的【内连接】多了最后一条记录:

Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

总结:(个人理解方式)

标准SQL语句连接方式:

【A left join B】left join即把左边表A当作基准。在内连接操作方式下,遇到符合连接条件的记录加入结果集,遇到A中不符合条件的记录也加入(因为它是标准),但对应B表的记录用null填充;

【A right join B】right join即把右边表B当作基准。在内连接操作方式下,遇到符合连接条件的记录加入结果集,遇到B中不符合条件的记录也加入(因为它是标准),但对应A表的记录用null填充;

oracle扩展连接方式:连接条件哪边表的列用(+),则它的记录用null值填充(也可把null当作占位符一样,没有东西空占着位置),另一边的表就是会把不符合连接条件的记录也加进查询结果中。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137819.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oracle与mysql的存储区别_存储过程和触发器的区别和联系

    oracle与mysql的存储区别_存储过程和触发器的区别和联系1.创建存储过程语句不同oraclecreateorreplaceprocedureP_ADD_FAC(id_fac_cdINES_FAC_UNIT.FAC_CD%TYPE)asmysqlDROPPROCEDUREIFEXISTS`SD_USER_P_ADD_USR`;createprocedureP_ADD_FAC(id_fac_…

    2025年11月13日
    3
  • jboss项目文件路径_java读取一个文件夹下的所有文件

    jboss项目文件路径_java读取一个文件夹下的所有文件==========转自:https://blog.csdn.net/tomcat_2014/article/details/50624120===========JavaWeb中读取文件资源的路径问题转载 2016年02月02日15:34:4916757在做javaweb开发的时候,我们可能会需要从本地硬盘上读取某一个文件资源,或者修改某一个文件,这个时候就需要先找到这个文件,然后用FileI…

    2026年1月22日
    3
  • 女人喜欢大男人还是小男人

    女人喜欢大男人还是小男人 转载自 http://hi.baidu.com/512347937/blog/item/6651e4cdec149c510eb3452c.html      大男人,小男人,到底谁能满足现代女人?现代女人首先取悦的是自己,然后才是男人,不管是大人,还是小男人,他们是他们,她是她自己。她为自己做这一切,她应该享有完美的人生。  经常有人问:你觉得什么是大男人,什么是小男人?  一般

    2022年7月25日
    9
  • Java AbstractMethodError 原因分析:运行eureka客户端报错

    Java AbstractMethodError 原因分析:运行eureka客户端报错我在创建euraka客户端时报错,java.lang.AbstractMethodError:null,在网上找了大半天也没有找到靠谱的答案,探求本质,多数文章都是浮于表面,并没有对错误原因进行深入分析,后面我找到了一篇对java.lang.AbstractMethodError原理进行讲解的文章,才恍然大悟。首先java.lang.AbstractMethodError是运行时错误,编译时…

    2022年6月2日
    31
  • Android P 新特性抢先看[通俗易懂]

          上周的世界移动通信大会上,我们看到了安卓开发者,设备生产者和芯片合作者组成的安卓生态系统不断的给用户代码惊喜的体验。      新特性下面就来看看AndroidP第一个预览版的一些很酷的特性。      1,Wi-Fi室内定位      精确的室内定位一直以来都是一个挑战,它给lbs创造了新的机遇。AndroidP支持了IEEE802.11mcWi-Fi协议,…

    2022年4月14日
    43
  • 计算机清理垃圾代码,你也可以写代码系列,一键清除系统垃圾文件的代码(超简单)-清除垃圾文件…

    计算机清理垃圾代码,你也可以写代码系列,一键清除系统垃圾文件的代码(超简单)-清除垃圾文件…电脑使用久了,系统或者软件就会产生大量的日志文件、临时文件等垃圾文件。这些垃圾文件日积月累,不仅会大量占用磁盘空间,也会严重拖慢系统运行速度。所以定时清理垃圾文件十分有必要。我们可以手动删除,也可以借助本文提供的批处理自动删除。1,创建一个清除垃圾的.bat文件(1)在桌面上单击鼠标右键,选择“新建”选择“文本文档”(2)将新建的文件改名为“垃圾文件清除.bat”(注意.txt后缀要记得删掉)…

    2022年6月18日
    121

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号