zoukankan      html  css  js  c++  java
  • Oracle-where exists()、not exists() 、in()、not in()用法以及效率差异

    0、exists() 用法:

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

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

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

    但是,如果单独执行括号中的这句话是会报语法错误的,这也是使用exists需要注意的地方。

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

    PS:not exists()  正好相反

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

    1、in() 的用法:

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

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

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

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

    2、 “exists”和“in”的效率问题

    0)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通常查询速度快的原因。

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

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

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

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

    参考:https://www.cnblogs.com/zhengshuheng/p/4749121.html

  • 相关阅读:
    自定义lync状态
    实现SharePoint2010企业内容管理资源中心
    用代码实现Sharepoint2010的个人信息的照片上传(原创)
    用代码实现Sharepoint2010的个人信息的照片上传(2)(原创)
    window.open的例子和使用方法以及参数说明(完整版)
    一些困惑的事情
    建立三层结构的ASP应用程序
    ASP.net常用函数
    ASP.NET数据库使用精典读取数据库中数据
    配置你的ASP.NET运行环境
  • 原文地址:https://www.cnblogs.com/Formulate0303/p/12606787.html
Copyright © 2011-2022 走看看