资讯详情

oracle 表连接

一、表连接是在多个表之间用连接条件连接,当优化器用表连接进行分析时sql除了基础sql写法决定了表连接的类型,并确定了以下三种情况来指定执行计划

1.表连接顺序,无论连接多少个表,sql在执行过程中,只能连接两个表,然后根据连接结果连接下一个两个表,直到所有表连接完成,连接顺序有两层含义,一个是决定谁是两个表连接outer table (驱动表) 谁是inner table(驱动表),二是多表连接时,先连接哪两个表

2.有四种表连接方法:排序合并连接、嵌套循环连接、哈希连接、笛卡尔连接、优化器分析sql决定使用哪种连接

访问单表的方法 在连接表格时,优化器还应决定如何读取表格中的数据,如用全表扫描或索引、如何索引等

二、表连接类型

类型分为内链接和外连接,类型决定了表连接的结果,sql写作直接决定了类型

1.内部链接:只要完全满足连接条件,连接结果只包含记录sql内部没有写外部连接的关键字,即内部链接,内部链接的三种写作方法,其中一种是oracle专用的

SELECT T1.COL1,T1.COL2,T2.COL3 FROM T1,T2 WHERE T1.COL2=T2.COL2;

SELECT T1.COL1,T1.COL2,T2.COL3 FROM T1 JOIN T2 ON(T1.COL2=T2.COL2);

SELECT T1.COL1,

COL2,T2.COL3 FROM T1 JOIN T2 USING(COL2);

标准sql中还有一种natural join ,这意味着只两个表的所有同名列作为连接列,不推荐使用。虽然会省去写连接列,但会增加sql报错的风险

2、外连接,

除了完全满足连接条件的记录外,连接结果还包括所有驱动表中不满足连接条件的记录。外部连接分为三种类型,左连接(left outer join),右连接(right outer join),全连接(full outer join)

左边是驱动表,左边是驱动表

SELECT T1.COL1,t1.COL2,T2.COL3 FROM T1,t2 where t1.col2=t2.col2( );

SELECT T1.COL1,t1.COL2,T2.COL3 FROM T1 left outer join T2 on (t1.col2=t2.col2);

SELECT T1.COL1, COL2,T2.COL3 FROM T1 left outer join T2 USING(COL2);

右连接,右边为驱动表

SELECT T1.COL1,t2.COL2,T2.COL3 FROM T1,t2 where t1.col2( )=t2.col2;

SELECT T1.COL1, COL2,T2.COL3 FROM T1 right outer join T2 USING(COL2);

SELECT T1.COL1,t2.COL2,T2.COL3 from t1 right join t2 on(t1.col2=t2.col2);

全连接相当于左连接 union 右连接

SELECT T1.COL1,t1.COL2,T2.COL3 from t1 full join t2 on(t1.col2=t2.col2);

3.当连接除连接条件外还有其他条件时

内链接以下两个句子结果相同

SELECT T1.COL1,t1.COL2,T2.COL3 from t1 join t2 on(t1.col2=t2.col2 and t1.col1=1);

SELECT T1.COL1,t1.COL2,T2.COL3 from t1 join t2 on(t1.col2=t2.col2) where t1.col1=1;

外部连接会有所不同,因此在外部连接中,除了连接限制条件外,其他限制条件的文本位置 ,影响最终结果

SELECT T1.COL1,t1.COL2,T2.COL3 from t1 left outer join t2 on(t1.col2=t2.col2 and t1.col1=1);

SELECT T1.COL1,t1.COL2,T2.COL3 from t1 left join t2 on(t1.col2=t2.col2) where t1.col1=1;

以上两个标准sql 语句在oracle中用( )表达时,可以分别写成

SELECT T1.COL1,t1.COL2,T2.COL3 FROM T1,t2 where t1.col2=t2.col2( ) and

t1.col1( )=1;

SELECT T1.COL1,t1.COL2,T2.COL3 FROM T1,t2 where t1.col2=t2.col2( ) and

t1.col1=1;

t1.col2( )=1即可表示这个条件也在连接限制条件内。

哈希外连接将用于上述第一条语句的执行计划(hash join outer),第二条语句将使用哈希连接(hash join),也就是说,它实际上是由等价内链接执行的

适用于内链接natural join 也可用于外部连接

三、表连接法

1.排序合并连接(sort merge join)

两个表分别排序后合并,得到结果集

执行效率不如哈希连接,但比哈希连接更适用,因为哈希连接通常只用于等值连接条件,不同的连接条件可以用于排序合并连接,如 < <= > => 等等。

并不适合在OLAP,当然,如果可以避免排序,也可以使用OLAP,例如,索引存在于两个表的连接列中

在严格意义上,没有驱动表的概念

2.嵌套循环连接(nested loops join)

通过两层嵌套循环(外循环和内循环)连接两个表来获得结果集

步骤

a、驱动表和驱动表根据规则确定,驱动表用于外层,驱动表用于内层

b、根据谓语条件访问驱动表,得到结果集1

c、遍历结果集1同时遍历驱动表,即先取出结果集1中的记录,然后根据记录遍历驱动表找出匹配的记录,然后取出结果集1中的第二个记录,继续遍历驱动表,直到结果集1中的所有记录完成,即结果集1中的记录数量,以及驱动表将遍历循环数量和内部循环数量

嵌套循环连接的关键点在于结果集1的数据量。如果数据量少,效率会高。同时,该连接具有其他连接所没有的优点:可以实现快速响应。也就是说,您可以快速返回已连接并满足连接条件的记录,而无需等待所有连接完成

oracle 11g中加入了向量I/O(vector I/O)提高嵌套循环性能

3、哈希连接(hash join)

通过哈希运算连接两个表获得结果集

_hash_join_enabled 参数 默认为true ,启用hash_join

alter session set "_hash_join_enabled"=true;

alter session set "_hash_join_enabled"=false;

use_hash hint 优先级高于此参数

Si & Bj Sn&Bn(代表磁盘hash partition)

hash优缺点及适用场景

a、hash不一定排序,或者大部分都不会排序

b、驱动表的连接列可选择性(selectivity)尽可能好,因为会影响hash bucket中的记录数

c、只适用于CBO,仅适用于等值连接

d、适用于小表与大表连接,结果集大。当小表连接列的选择性很好时,哈希连接的执行时间相当于大表扫描的时间

e、连接两个表时,完成hash后,hash table内存可以完全存储(PGA)哈希连接的执行效率会很高

四、笛卡尔连接(cross join)

两个表在连接时没有任何连接条件,实际上是一种特殊的合并连接,不排序(MERGE JOIN CARTESIAN),T1结果集为m,T2结果集为n,笛卡尔连接后的记录数为M*N

select t1.col1,t2.col3 from t1,t2;

标准sql :

select t1.col1,t2.col3 from t1 cross join t2;

笛卡尔连接一般不好,通常是因为连接条件遗漏或使用ordered hint,而sql文本上相邻的俩个表有没有直接的关联条件造成的,还有可能是统计信息不准确造成。除非是刻意的,比如为了避免多次的大表全表扫描才会使用这种连接。

四、反连接(anti join)

结果集1,结果集2t1.col2=t2.col2将被删除,只返回不符合连接条件的值

select * from t1 where col2 not in( select col2 from t2);

select * from t1 where col2<> all(select col2 from t2);

select * from t1 where not exists(select 1 from t2 where col2=t1.cl2);

当t1,t2没有null值时 ,上面三条语句结果相同

当有null时,结果会不一样

not in 和

<> all 对null敏感,当他们后面的子查询或常量集合有null,则整个sql的执行结果就是null

not exists

对null不敏感,不影响执行结果

五、半连接(semi join)

t1,t2连接时,驱动表t1,被驱动表t2,即使t2中满足连接条件t1.col2=t2.col2有多条记录,也只会返回第一条记录,即半连接时特殊的内连接,实际具有去重的作用。当子查询展开时,oracle 通常会把where 后的条件 =any,exist,in等查询转换为对应的半连接。

select * from t1 where col2 in(select col2 from t2);

select * from t1 where col2= any(select col2 from t2);

select * from t1 where exists(select col2 from t2 where col2=t1.col2);

六、星形连接(star join)

通常用于数据仓库,既不是连接类型,也不是连接方法,他是一个事实表(fact table)与多个维度表(dimension table)之间的连接,基本上事实表的外键列对应各维度表的主键列,事实表是张大表,后面章节会详细描述这个连接

标签: 连接器sn

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台