大家好,又见面了,我是你们的朋友全栈君。
Oracle连接查询有3种:交叉连接、内连接、外连接。
交叉连接结果是其他连接结果的超集,外连接结果是内连接结果的超集。
接下的例子以departments_v、employees_v两个视图数据为例(4条部门数据,9条人员数据)
1.交叉连接:又称笛卡尔积连接,是两个或多个表间的无条件连接,因此它会将表1的每一条数据与表2的每一条数据连接,因此结果会有4*9=36条数据
2.内连接:根据指定的连接条件进行连接查询,因此满足连接条件的数据才会出现在结果集。
两个表进行内连接查询时,先找到表1的第一条记录,然后从头到尾扫描表2,将符合连接条件的记录与表1第一条记录连接成结果;
当表2扫描一遍后,再从表1的第二条记录开始,从头到尾扫描表2,将符合连接条件的与表1第二条记录连接成结果…
:
直至表1中所有记录处理完毕为止。
Oracle中,内连接的两种写法如下图
3.外连接:在内连接的基础上,将某个连接表不符合连接条件的记录加入结果集。
Oracle中,左外连接、右外连接均有两种连接方式。
⑴先看标准SQL语句连接方式
【左外连接】在内连接基础上,将连接操作符左侧表不符合连接条件的记录加入结果集中,右侧表则用null填充。(个人觉得这更适合解释标准SQL语句的连接方式)
下图为【dept表 left join emp表】此时可以把dept表为基准,连接条件为两表部门号相同且部门号为10;
左侧表dept 10号部门的记录 与右侧表emp 10号部门的员工记录 满足连接条件,因此加入结果集;
左侧表dept 20号部门的记录 与右侧表emp 20号部门的员工记录 不满足连接条件,但该查询为左连接,因此会把左侧表dept20号部门的记录加入结果集,右侧表则null填充;
…
下图为【emp表 left join dept表】 可按着上面的情况分析
【右外连接】在内连接基础上,将连接操作符右侧表不符合连接条件的记录加入结果集中,左侧表则用null填充。(个人觉得这更适合解释标准SQL语句的连接方式)
【下图为dept表right join emp表】此时可以把emp表为基准,连接条件为两表部门号相同且部门号为10;
右侧表emp 10号部门的员工记录 与左侧表dept 10号部门的记录 满足连接条件,因此加入结果集;
右侧表emp 20号部门的员工记录 与左侧表dept 20号部门的记录 不满足连接条件,但该查询为右连接,因此会把右侧表emp 20号部门的员工记录加入结果集,左侧表则null填充;
…
【下图为emp表right join dept表】可按着上面的情况分析
⑵Oracle扩展的连接方式
【下图为dept(+)emp】(右外连接)
【右外连接】在内连接基础上,将连接操作符右侧表不符合连接条件的记录加入结果集中,左侧表则用null填充。
因此可以解析为:连接条件等号哪边的表用null填充,哪边表的列均用(+),另一边的表则会将不符合连接条件的记录加入结果集,如下图的emp表
交换表的顺序为employees_v emp, departments_v dept(此时称为左外连接),但结果一样,只不过结果的列顺序也交换过来,为EMPLOYEE_ID、FIRST_NAME、DEPARTMENT_ID、 DEPARTMENT_ID、DEPARTMENT_NAME
【下图为dept emp(+)】(左外连接)
【左外连接】在内连接基础上,将连接操作符左侧表不符合连接条件的记录加入结果集中,右侧表则用null填充。
因此可以解析为:连接条件等号哪边的表用null填充,哪边表的列均用(+),另一边的表则会将不符合连接条件的记录加入结果集,如下图的dept表
交换表的顺序为employees_v emp, departments_v dept(此时称为右外连接),但结果一样,只不过结果的列顺序也交换过来,为EMPLOYEE_ID、FIRST_NAME、DEPARTMENT_ID、 DEPARTMENT_ID、DEPARTMENT_NAME
!!!若dept表的列需全加(+),却如下图那样,则不会起作用,仅仅如内连接查询般。
4.全外连接:在内连接的基础上,将连接操作符两侧表不符合连接条件的记录加入结果集。
全外连接只有标准SQL语句的连接方式表示。
分析:将满足条件的记录选出,再将一侧emp表中不满足连接条件的记录加入结果集,最后将另一侧dept表中不满足连接条件的记录加入结果集。
下图为去掉一个条件,分析可按照上图情况推理。
比同样连接条件的【内连接】多了最后一条记录:
总结:(个人理解方式)
标准SQL语句连接方式:
【A left join B】left join即把左边表A当作基准。在内连接操作方式下,遇到符合连接条件的记录加入结果集,遇到A中不符合条件的记录也加入(因为它是标准),但对应B表的记录用null填充;
【A right join B】right join即把右边表B当作基准。在内连接操作方式下,遇到符合连接条件的记录加入结果集,遇到B中不符合条件的记录也加入(因为它是标准),但对应A表的记录用null填充;
oracle扩展连接方式:连接条件哪边表的列用(+),则它的记录用null值填充(也可把null当作占位符一样,没有东西空占着位置),另一边的表就是会把不符合连接条件的记录也加进查询结果中。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137819.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...