@

一、表连接类型

表连接类型可以分为:内连接、外连接,在看《收获,不止sql优化》一书并做了笔记

1.1 内连接

内连接:指表连接的结果只包含那些完全满足连接条件的记录。下面学习一下内连接的,给个例子,这里创建两张表,然后用内连接方式查询,看看例子:

SQL>select * from t1;
id col1
---- ----
A A1
B B1
C C1
D D1
SQL>select * from t2;
id col2
---- ----
A A2
C B2
D C2
E D2
SQL>select * from t1,t2 where t1.id=t2.id;
id col1 col2
---- ---- ----
A A1 A2
C C1 C2
D D1 D2

判断标准:SQL中没有定义外连接的left outer join、right outer join、full outer join以及(+)符合,这种SQL统一叫内连接,所以sql中不能有一个外连接的标识SQL,不然整条sql都变成了外连接

Oracle(+)符号用法:

Oracle左右连接可以使用(+),+号在左表示右外连接,在右表示左外连接

例子,下面的sql都属于内连接:

t1,t2方法

select * from t1,t2 where t1.id = t2.id;

inner join on方法

select * from t1 inner join t2 on t1.id = t2.id

inner关键字可以省略

select * from t1 join t2 on (t1.id=t2.id);

join using方法

select * from t1 join t2 using(id);

1.2 外连接

外连接:外连接是对内连接的拓展,它是指包含完全符合的记录之外,还会包含驱动表所有不符合的连接条件的记录

左连接的情况

SQL>select * from t1;
id col1
---- ----
A A1
B B1
C C1
D D1
SQL>select * from t2;
id col2
---- ----
A A2
C B2
D C2
E D2
SQL>select * from t1 left join t2 on t1.id=t2.id;
id col1 col2
---- ---- ----
A A1 A2
B B1
C C1 C2
D D1 D2

右连接,反过来,以被驱动表t2为准;全外连接就是不管驱动表t1还是被驱动表t2全都查出来,不管是否符合连接条件,语法是full join on

二、表连接方法

2.1 表连接方法分类

两个表之间的表连接方法有排序合并连接、嵌套循环连接、哈希连接、笛卡尔连接

  • 排序合并连接(merge sort join)

  • 嵌套循环连接(Nested loop join)

  • 哈希连接(Hash join)

  • 笛卡尔连接(Cross join)

2.2 表连接方法特性区别

(1)表访问次数区别

使用Hint语法强制使用nl

select /*+ leading(t1) use_nl(t2)*/ * from t1,t2
where t1.id = t2.id
and t1.id in (17,19);

查看执行计划

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT

SQL_ID  245z7n1cxaf3m, child number 0
-------------------------------------
SELECT /*+ leading(t1) use_nl(t2)*/ * FROM t1, t2 WHERE t1.id = t2.t1_id Plan hash value: 1967407726 --------------------------------------------------------------------------------
-----
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buff
ers |
--------------------------------------------------------------------------------
-----
| 0 | SELECT STATEMENT | | 1 | | 300 |00:00:00.25 | 29
747 |
| 1 | NESTED LOOPS | | 1 | 300 | 300 |00:00:00.25 | 29
747 |
| 2 | TABLE ACCESS FULL| T1 | 1 | 300 | 300 |00:00:00.01 |
27 |
|* 3 | TABLE ACCESS FULL| T2 | 300 | 1 | 300 |00:00:00.25 | 29
720 |
--------------------------------------------------------------------------------
----- Predicate Information (identified by operation id):
--------------------------------------------------- 3 - filter("T1"."ID"="T2"."T1_ID") Note PLAN_TABLE_OUTPUT - dynamic sampling used for this statement (level=2) 已选择24行。

Nested sort join中,驱动表被访问0或1次,被驱动表被访问0或者n次,n是驱动表返回的结果集条数

然后同样可以进行hash join、merge join的实践,hash join用/*+ leading(t1) use_hash(t2) */

Hash join中驱动表被访问0或者1次,被驱动表也一样

merge sort join中驱动表被访问0或者1次,被驱动表也一样

(2)表连接顺序影响

对于前面的用t1为驱动表的情况,现在换一下顺序,

SQL>SELECT /*+ leading(t2) use_nl(t1)*/ * FROM t1, t2 WHERE t1.id = t2.t1_id;
SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); PLAN_TABLE_OUTPUT SQL_ID fgw5v7y16yn4m, child number 0
-------------------------------------
SELECT /*+ leading(t2) use_nl(t1)*/ * FROM t1, t2 WHERE t1.id = t2.t1_id Plan hash value: 4016936828 --------------------------------------------------------------------------------
-----
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buff
ers |
--------------------------------------------------------------------------------
-----
| 0 | SELECT STATEMENT | | 1 | | 300 |00:00:00.30 | 70
139 |
| 1 | NESTED LOOPS | | 1 | 300 | 300 |00:00:00.30 | 70
139 |
| 2 | TABLE ACCESS FULL| T2 | 1 | 9485 | 10000 |00:00:00.01 |
119 |
|* 3 | TABLE ACCESS FULL| T1 | 10000 | 1 | 300 |00:00:00.29 | 70
020 |
--------------------------------------------------------------------------------
----- Predicate Information (identified by operation id):
--------------------------------------------------- 3 - filter("T1"."ID"="T2"."T1_ID") Note PLAN_TABLE_OUTPUT - dynamic sampling used for this statement (level=2) 已选择24行。

可以看出表连接顺序对NL连接是有影响的,同理实验,可以看出对hash join也是有影响的,而merger join不影响

(3)表连接排序

对于这几种表连接,可以用set autotrace on方式查看sorts属性,可以得出只有merge join是有排序的,Nl连接和hash join是无序的

(4)各表连接失效情况

hash join不支持的条件是“>、<、<>、like”的连接方式,merge join不支持的条件是“<>、like”支持“<、>”的情况,而nl连接没有限制,这是几种表连接方法的区别

Oracle表连接学习笔记的更多相关文章

  1. MySQl 子查询,左右连接,多表连接学习笔记

    1.子查询是指在还有一个查询语句中的SELECT子句.   例句:   SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);   当中, ...

  2. Oracle RAC学习笔记:基本概念及入门

    Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章]    oracle 10g real applica ...

  3. Oracle RAC学习笔记01-集群理论

    Oracle RAC学习笔记01-集群理论 1.集群相关理论概述 2.Oracle Clusterware 3.Oracle RAC 原理 写在前面: 最近一直在看张晓明的大话Oracle RAC,真 ...

  4. Oracle EBS应用笔记整理 (转自IT++ flyingkite)

    ***************************************************** Author: Flyingkite Blog:   http://space.itpub. ...

  5. Oracle基础学习笔记

    Oracle基础学习笔记 最近找到一份实习工作,有点头疼的是,有阶段性考核,这...,实际想想看,大学期间只学过数据库原理,并没有针对某一数据库管理系统而系统的学习,这正好是一个机会,于是乎用了三天时 ...

  6. oracle表分区以及普表转分区表(转)

    概述 Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任务,分区是构建 ...

  7. oracle表分区、表分析及oracle数据泵文件导入导出开心版

    1.先说oracle表分区是什么吧,这样吧我们来举个桃子,栗子太小,我们就不举了,我们来举个桃子. 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到 ...

  8. Oracle 表连接

    Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制)      (2)右外连接(右边的表不加限制)      (3)全外连接(左右两表都不 ...

  9. Oracle表空间,用户,用户授权

    一:Oracle表空间 1,Oracle表空间与SQL Server文件组对比 SQL Server的文件组(文件组包括若干MDF,NDF数据文件)对我们来说并不陌生,前段时间我在博客“怎样玩转千万级 ...

随机推荐

  1. springIOC源码解析之Bean的创建

    上一篇讲到了beanFactory的配置文件的解析和beanFactory的创建,都集中到了obtainFreshBeanFactory();这一句代码里了,本篇主要讲bean的创建过程 public ...

  2. C#网络编程学习(5)---Tcp连接中出现的粘包、拆包问题

    本文参考于CSDN博客wxy941011 1.疑问 我们使用第四个博客中的项目. 修改客户端为:连接成功后循环向服务器发送从1-100的数字.看看服务器会不会正常的接收100次数据. 可是我们发现服务 ...

  3. 清除input框对浏览器保存的用户名和密码自动填充问题

    清除input框对浏览器保存的用户名和密码自动填充问题: type类型写如下写法,聚焦的时候type类型为“password” <input ng-model="getpwd" ...

  4. FoundToday for HK 技术支持

    FoundToday for HK 技术支持   技术支持网址:有问题或建议请留言. 邮箱地址: swvrwafet@zoho.com Program design & system cons ...

  5. Vue 5 -- axios、vuex

    一.内容回顾 1.webpack(前端中工作,项目上线之前对整个前端项目优化) - entry:整个项目的程序入口(main.js或index.js): - output:输出的出口: - loade ...

  6. sql 更新 批量更新 更新得到主键

    import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.jdbc.c ...

  7. chapter03

    import scala.collection.mutable.ArrayBuffer /** * Created by EX-CHENZECHAO001 on 2018-03-29. */class ...

  8. 15-----jQuery补充

    jquery除了咱们上面讲解的常用知识点之外,还有jquery 插件.jqueryUI知识点 jqueryUI 官网: https://jqueryui.com/ jqueryUI 中文网: http ...

  9. 让最新的 Android Q Beta 3 强制重启的 Project Mainline,到底是什么?

    一. 序 最新的 Android 版本 Q,已经发布了 Android Q Beta 3,虽然没有正式发布,但是不少用户已经加入了测试计划,抢先体验 Android Q 的新功能. 近期不少体验用户反 ...

  10. AOP的XML实现方式

    与注解方式类似,只不过所有设置是通过xml来设置 // 切面类 public class Aop { public void around(ProceedingJoinPoint pjp) throw ...