`
freeskywcy
  • 浏览: 214969 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

oracle中的exists和not exists和in用法详解

 
阅读更多

有两个简单例子,以说明 “exists”和“in”的效率问题

  1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;

 

  T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。

 

  2) select * from T1 where T1.a in (select T2.a from T2) ;

 

  T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。

 

  exists 用法:

 

  请注意 1)句中的有颜色字体的部分 ,理解其含义;

 

  其中 “select 1 from T2 where T1.a=T2.a” 相当于一个关联表查询,相当于

 

  “select 1 from T1,T2 where T1.a=T2.a”

 

  但是,如果你当当执行 1) 句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。

 

  “exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。

 

  因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这 1) 句的where 条件成立。

 

  in 的用法:

 

  继续引用上面的例子

 

  “2) select * from T1 where T1.a in (select T2.a from T2) ”

 

  这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。

 

  打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用 2)的写法就可以这样:

 

  “select * from T1 where T1.ticketid in (select T2.id from T2) ”

 

  Select name from employee where name not in (select name from student);

 

  Select name from employee where not exists (select name from student);

 

  第一句SQL语句的执行效率不如第二句。

 

  通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因

分享到:
评论

相关推荐

    oracle中exists_和in的效率问题详解

    oracle中exists_和in的效率问题详解

    oracle中not exists对外层查询的影响详解

    主要给大家介绍了关于oracle中not exists对外层查询的影响,文中介绍的非常详细,需要的朋友可以参考下。

    Oracle高级sql学习与练习

    2、EXISTS和NOT EXISTS的使用 3、WITH字句 4、MERGE INFO 合并资料 5、层次查询(HIERARICAL RETRIVEL) 6、DECODE函数和行列互换 7、CASE表达式 8、ROWNUM-TOP-N分析 9、相关子查询和非相关子查询 10、增强GROUP BY...

    oracle详解

    导入/导出是ORACLE幸存的最古老的两个命令行工具,其实我从来不认为Exp/Imp是一种好的备份方式,正确的说法是Exp/Imp只能是一个好的转储工具,特别是在小型数据库的转储,表空间的迁移,表的抽取,检测逻辑和物理...

    Oracle中的半联结和反联结详解

    主要介绍了Oracle中的半联结和反联结详解,也称半连接和反连接,其实就是in、exists,需要的朋友可以参考下

    精通SQL 结构化查询语言详解

    《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...

    oracle select执行顺序的详解

    SQL Select语句完整的执行顺序:1、from子句组装来自不同数据源的数据;2、where子句基于指定的条件对记录行进行筛选;3、group by子句将数据划分为多个分组;...在Oracle中可以几乎将所有的IN操作

    精通SQL--结构化查询语言详解

    10.3.1 使用in引入相关子查询 198 10.3.2 比较运算符引入相关子查询 200 10.3.3 在having子句中使用相关子查询 201 10.4 嵌套子查询 203 10.5 使用子查询创建视图 204 10.6 树查询 205 第11章 数据插入操作 ...

    Oracle 查询优化的基本准则详解

    以提高查询速度3:使用 where 而不是 having ,where是用于过滤行的,而having是用来过滤组的,因为行被分组后,having 才能过滤组,所以尽量用户 WHERE 过滤4:使用 exists 而不用 IN 因为 Exists 只检查行的存在,...

    PL/SQL学习笔记

    3.exists 判断这个元素是否存在,exists(x) 4.extend方法 不带参数加一个元素 extend(x)加x个元素 extend(x,y) 5.first属性,返回第一个元素的下标 6.last 属性,赶回最后一个元素的下标 7.limit属性 ...

    收获不止SQL优化

    第1章 全局在胸——用工具对...17.1.3 IN与EXISTS之争 455 17.1.4 总结探讨 457 17.2 误区背后的话题扩展 457 17.2.1 话题扩展之等价与否优先 457 17.2.2 话题扩展之颠覆误区观点 458 17.3 全书完,致读者 461

    整理后java开发全套达内学习笔记(含练习)

    exist 存在, 发生 [ig'zist] '(SQL关键字 exists) extends (关键字) 继承、扩展 [ik'stend] false (关键字) final (关键字) finally (关键字) fragments 段落; 代码块 ['frægmәnt] FrameWork [java] 结构,...

Global site tag (gtag.js) - Google Analytics