表的连接在sql语句中尤为重要。外连接,内连接,半连接,反连接等等各种连接,看似简单的一个连接里面还是有不少的细节的。对于sql调优来说也是很重要的。

像下面的形式的sql就属于半连接,使用了in子句,对于exists的实现也是属于半连接。

--in半连接

SQL> select dname from dept dept where deptno in (select deptno from emp emp);

DNAME

--------------

RESEARCH

SALES

ACCOUNTING

--exists半连接

SQL> select dname from dept dept where exists (select null from emp emp where emp.deptno=dept.deptno)

2  /

DNAME

--------------

RESEARCH

SALES

ACCOUNTING

可能对于上面两种连接大家不以为然,认为把需要用到的表直接放在from子句后效果是一致的,答案也不是肯定的。

比如下面的形式,可能输出的结果就多了很多。大概14条记录,但是通过半连接的方式会输出3行记录。

SQL> select dept.dname from dept dept,emp empwhere dept.deptno=emp.deptno;

DNAME

--------------

RESEARCH

SALES

SALES

RESEARCH

SALES

SALES

ACCOUNTING

RESEARCH

ACCOUNTING

SALES

RESEARCH

SALES

RESEARCH

ACCOUNTING

14 rows selected.

所以说如果要得到一个相同的输出结果,还是需要distinct+inner join

SQL> select distinctdept.dname from dept dept,emp emp where dept.deptno=emp.deptno;

DNAME

--------------

ACCOUNTING

RESEARCH

SALES

对于半连接的可替换实现,大体有以下几种方式

--使用集合

select dept.dname from dept dept,

(select deptno from dept

intersect

select deptno from emp emp)b

where dept.deptno=b.deptno ;

DNAME

--------------

ACCOUNTING

RESEARCH

SALES

--使用any

SQL> select dept.dname from dept dept where deptno=any(select deptno from emp emp);

DNAME

--------------

RESEARCH

SALES

ACCOUNTING

--使用distinct和内连接

SQL> select distinct emp.deptnofrom dept dept,emp emp

where dept.deptno=emp.deptno;

DEPTNO

----------

30

20

10

SQL> select distinct dept.deptnofrom dept dept,emp emp

where dept.deptno=emp.deptno;

DEPTNO

----------

30

20

10

大体说了下关于半连接的一些实现,可能在实际的使用中,最直观的感受还是通过执行计划来看到。

启用了半连接,在执行计划中会有semi的字样。

也可以手动指定不需要走半连接。使用Hint no_semijoin

oracle 半连接 效率,关于oracle中的半连接相关推荐

  1. oracle 去重效率最高,oracle去重整理

    我们在实际工作中,当信息系统数据质量不高的时候,可能存在数据表中有重复记录的问题.方法: 1.保留重复记录中的一条 delete from t where   rowid   not   in   ( ...

  2. oracle nvl 效率,说说 Oracle 的 NVL 与 NVL2 函数

    1 NVL 函数 1.1 语法 如果需要为查询出的为 null 的字段,设置一个默认值,就可以使用 NVL 函数.如果 expr1 为 null ,则 NVL 会返回 expr2. 如果 expr1 ...

  3. 简单介绍oracle执行计划,Oracle性能优化之oracle中常见的执行计划及其简单解释

    一.访问表执行计划 1.table access full:全表扫描.它会访问表中的每一条记录(读取高水位线以内的每一个数据块). 2.table access by user rowid:输入源ro ...

  4. 提高oracle查询效率

    转载自: http://zhidao.baidu.com/link?url=E_HaRWGF3wCYYKG1l-qg5pNmjsePoH3wo_81Zpf5GaytfIW869RhWTIR6_jGPh ...

  5. oracle触发器比较,Oracle使用触发器和mysql中使用触发器的比较

    一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...

  6. 运用PARALLEL方式成倍提升Oracle数据分析效率

    运用PARALLEL方式成倍提升Oracle数据分析效率 Oracle作为一种大型数据库,在我国已成为大型企事业单位(如公立医院)的主流数据库并占有了绝对的市场份额.这就意味着审计工作同Oracle的 ...

  7. oracle 在此 select 语句中缺少 into 子句,Go database/sql文档

    No.1 文档概要 在Golang中使用SQL或类似SQL的数据库的惯用方法是通过 database/sql 包操作.它为面向行的数据库提供了轻量级的接口.这篇文章是关于如何使用它,最常见的参考. 为 ...

  8. timesten mysql_Timesten(TT)和ORACLE执行效率测试

    Timesten(TT)和ORACLE执行效率测试 TT是一个内存数据库,在某些方面执行要比oracle快,因为代码路径和优化器 都没有oracle那么复杂,即使把oracle的数据全部cache到s ...

  9. oracle 设置忽略关键字,Oracle中Hint被忽略的几种常见情形

    Hint可以影响优化器对于执行计划的选择,但这种影响不是强制性的,优化器在某些情况下可能会忽略目标SQL中的Hint.由于各种原因导致Hint被Oracle忽略后,Oracle并不会给出任何提示或者警 ...

最新文章

  1. Pandownload 下线了,我自己花了 30 分钟自己搭建了一个网盘
  2. 关于Java函数传参以及参数在函数内部改变的问题——JAVA值传递与引用最浅显的说明!...
  3. PySpider HTTP 599: SSL certificate problem错误的解决方法
  4. 拓扑排序(Topology_Sort)
  5. Tcpdump(linux)下载、安装、使用说明
  6. Python深入类和对象
  7. linux 关于休眠得脚本,linux – 如果条件为true,请将cron作业休眠5分钟
  8. C语言/C++程序员大神打造纯C的电子时钟(加图形库+源码)
  9. Python爬虫项目:抓取智联招聘信息
  10. cisco初级随堂笔记1
  11. Arduino 超声波避障循迹小车,四轮智能小车
  12. 厉害!不到30行代码,自制成语接龙小游戏
  13. 修改Linux swap大小,LINUX操作系统如何调整SWAP大小
  14. 小小白的Android入门之计算器学习
  15. 从TikTok功能优化,抓住直播带货机遇
  16. 红帽牵手阿里云,水到渠成的合作
  17. 清北学堂 2017-10-06
  18. 模糊查询忽略大小写解决方案
  19. ArcGIS Pro制图-河流曲线图例
  20. Ubuntu PPA 软件源用法介绍

热门文章

  1. idea补全代码快捷键
  2. 将d:\java目录下的所有.java文件复制到d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad
  3. leetcode 385. Mini Parser | 385. 迷你语法分析器(Java)
  4. leetcode 216. Combination Sum III | 216. 组合总和 III(Java)
  5. netty系列之:使用UDP协议
  6. linux上设置git高亮
  7. jQuery的概念、用法、常见面试题详解
  8. 23行代码_动图展示——快排详解(排序最快的经典算法)
  9. 四种解法——求子序列的最大连续子序和(普通解法、求和解法、分治法、O(n)级解法)(面试经典题)
  10. java虚拟机内存空间