oracle常用的连接类型

教程发布:风哥 教程分类:ITPUX技术网 更新日期:2022-02-12 浏览学习:720

[p=25, null, left][color=rgb(62, 62, 62)]表连接就是指多个表之间用相应的连接条件连接在一起,从多个表中获取存储在这些表中不同维度的数据。当体现在SQL上面的时候,SQL语句中的from 后面会出现多张表名,而连接条件一般在where 或者 on 关键字后面展现。[p=25, null, left][color=rgb(62, 62, 62)]在一条SQL语句中,不管有多少张表做表连接,oracle在实际执行的时候都只能是两两表关联,依次执行,直到所有的表都连接完毕。[p=25, null, left][color=rgb(62, 62, 62)] [p=25, null, left][color=rgb(62, 62, 62)] 我们今天主要介绍两表连接的类型:[p=25, null, left][color=rgb(62, 62, 62)]在oracle数据库中表的连接方式一般分为两种类型:内连接和外连接。一般表的连接类型可以直接决定表连接的结果。当然表的连接类型是由SQL文本的书写方式所决定的。[p=25, null, left][color=rgb(62, 62, 62)]1、内连接:[p=25, null, left][color=rgb(62, 62, 62)]内连接是指表的连接的连接结果只返回那些完全满足连接条件的记录。对于包含表连接的目标sql来说,只要SQL 的文本中的WHERE条件没有出现外连接的关键字比如:left outer join ; right outer join ;full outer join ,或者是oracle中自定义的用来表示外连接的关键字(+),则认定该SQL的连接类型是内连接。[p=25, null, left][color=rgb(62, 62, 62)] [p=25, null, left][color=rgb(62, 62, 62)]我们使用oracle数据库中的自带的scott用户下的T1,T2表做实验测试。[p=25, null, left][color=rgb(62, 62, 62)]两张表的数据分布如下:[p=25, null, left][color=rgb(62, 62, 62)][img]http://mmbiz.qpic.cn/mmbiz/VkC3lgPs6cZDAdaeMiaWKNQaFwo50V2I0iarKltVUKXe5YSfaGdq615e530iaaoJt9QRTXn86gPf7Q88x5HwuPcHA/0?wx_fmt=png[/img]
[img]http://mmbiz.qpic.cn/mmbiz/VkC3lgPs6cZDAdaeMiaWKNQaFwo50V2I0FMmtactqZ5kf6RB9WWr7dy5ZySoaTqQJ0wNhYibS6zZ0W9EZaP7oJAg/0?wx_fmt=png[/img]
[img=357,100]file:///C:/Users/flybluey/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg[/img][p=25, null, left][color=rgb(62, 62, 62)] 我们先来执行最常用的内连接的SQL语句来:[p=25, null, left][color=rgb(62, 62, 62)]SELECT T1.*, T2.*FROM T1, T2 where T1.id = T2.id;[p=25, null, left][color=rgb(62, 62, 62)]相应的执行结果如下:[p=25, null, left][color=rgb(62, 62, 62)][img]http://mmbiz.qpic.cn/mmbiz/VkC3lgPs6cZDAdaeMiaWKNQaFwo50V2I0xBKJNlebPDM1Z3k5Klqhg72W9d7UdVyibJwrkmwicKRp2z74wplR00OA/0?wx_fmt=png[/img][img=481,100]file:///C:/Users/flybluey/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg[/img][p=25, null, left][color=rgb(62, 62, 62)]这种连接方式是大家最为熟悉的,返回的结果肯定就是两张表根据连接条件完全满足的结果集。另外内连接还有别的编写方式,比如:[p=25, null, left][color=rgb(62, 62, 62)] [p=25, null, left][color=rgb(62, 62, 62)]SELECT T1.*, T2.* FROM T1 join T2 on T1.id = T2.id;[p=25, null, left][color=rgb(62, 62, 62)]或者:[p=25, null, left][color=rgb(62, 62, 62)]SELECT T1.*, T2.* FROM T1 inner join T2 on T1.id = T2.id;[p=25, null, left][color=rgb(62, 62, 62)]上面的三种内连接的写法是等效的,其相应的执行结果:[p=25, null, left][color=rgb(62, 62, 62)][img]http://mmbiz.qpic.cn/mmbiz/VkC3lgPs6cZDAdaeMiaWKNQaFwo50V2I0VJl7HKLpnXEmJaS9R96JJcOoUU8Nib2B3LlIdoHTBnX4kQWGCIOiaNVg/0?wx_fmt=png[/img]
[img=531,100]file:///C:/Users/flybluey/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg[/img][p=25, null, left][color=rgb(62, 62, 62)]另外再跟大家介绍两种不太常用的写法:[p=25, null, left][color=rgb(62, 62, 62)]SELECT T1.NAME, T2.NAME,id FROM T1 join T2 using(id);[p=25, null, left][color=rgb(62, 62, 62)] [p=25, null, left][color=rgb(62, 62, 62)]SELECT NAME,id FROM T1 naturaljoin t2;[p=25, null, left][color=rgb(62, 62, 62)] [p=25, null, left][color=rgb(62, 62, 62)]这两种方式都不是很常用的方法,因为语法的本身存在一定的局限性。[p=25, null, left][color=rgb(62, 62, 62)]比如 join..using 这种方法 using 后面只能是两张表的公共列列的名字必须得一样。[p=25, null, left][color=rgb(62, 62, 62)]而natural的方式也是一样,与之不同的是会按照所有的列明一样的作为连接条件。鉴于上述的缺点,这两种方法基本不推荐使用。[p=25, null, left][color=rgb(62, 62, 62)] [p=25, null, left][color=rgb(62, 62, 62)]2、外连接[p=25, null, left][color=rgb(62, 62, 62)]外连接是指表的连接结果除了包含那些完全满足连接条件的记录之外还会包含驱动表中所有不满足该连接条件的记录,同时,驱动表中所有不满足该连接条件的记录所对应的被驱动表中的查询列均会以NULL值 来填充。[p=25, null, left][color=rgb(62, 62, 62)] [p=25, null, left][color=rgb(62, 62, 62)]外连接的连接方式包括:[p=25, null, left][color=rgb(62, 62, 62)]left outer join ;right outer join ;full outer join 同样也可以简写为:left join ; right join ;full join 。[p=25, null, left][color=rgb(62, 62, 62)] [p=25, null, left][color=rgb(62, 62, 62)]我们同样用上述的;两张测试表来实验外连接的几种连接方式不同,首先我们对T2表中的数据坐下调整。[p=25, null, left][color=rgb(62, 62, 62)]在T2 中插入一条T1中所没有的记录。[p=25, null, left][color=rgb(62, 62, 62)]我们先看左连接的查询结果:[p=25, null, left][color=rgb(62, 62, 62)][img]http://mmbiz.qpic.cn/mmbiz/VkC3lgPs6cZDAdaeMiaWKNQaFwo50V2I0ibFaNyexenfLdM3QyImzMfxmOjqO5UrZ1jG7CZb8icDIFLbVP5HxgVFw/0?wx_fmt=png[/img]
[p=25, null, left][color=rgb(62, 62, 62)] 在上述的语句中,T1表是驱动表,T2表是被驱动表,结果返回满足条件的所有T1表的记录,对于T2表不满足的字段用NULL代替。[p=25, null, left][color=rgb(62, 62, 62)]跟左连接同理的是右连接是以右边的表驱动表,看下面的示例:[p=25, null, left][color=rgb(62, 62, 62)][img]http://mmbiz.qpic.cn/mmbiz/VkC3lgPs6cZDAdaeMiaWKNQaFwo50V2I0q1YoYRXs9g1rQ6ia9ibwbficnr4ZmSmtG3ibjnWJAOb64mic7H8z3j1AdTw/0?wx_fmt=png[/img]
结果返回T2表的全部记录,对于T1表中的不满足连接条件的字段用NULL代替。[p=25, null, left][color=rgb(62, 62, 62)] [p=25, null, left][color=rgb(62, 62, 62)]另外对于全连接来说,返回的结果不但包含两张表中所有满足条件的记录外,还包含两张表中所有不满足条件的记录,在这些不满足条件的记录中,所对应的另外一张表的字段使用NULL来代替。 [img=0,1]http://mmbiz.qpic.cn/mmbiz/VkC3lgPs6cZDAdaeMiaWKNQaFwo50V2I0J1ZUzmP4YlbuK7ic1LsyYNFMicjWvTfUngV7aeDicRBjFZJaQZ3nwE7ug/0?wx_fmt=png[/img][p=25, null, left][color=rgb(62, 62, 62)]其实在oracle 数据库中 full join 的返回结果就是两张表做了一次left join 和一次right join 然后两个结果集再做一次union all 操作。大家可以在下面测试下。[p=25, null, left][color=rgb(62, 62, 62)]

本文标签:
网站声明:本文由风哥整理发布,转载请保留此段声明,本站所有内容将不对其使用后果做任何承诺,请读者谨慎使用!
【上一篇】
【下一篇】