zoukankan      html  css  js  c++  java
  • SQL中IN与EXISTS关键字

      偶遇这样一个场景,使用IN关键字进行检索数据所消耗的时间是使用EXISTS关键字进行检索数据所消耗的时间的接近30倍。一看差距这么大,查阅了一本SQL数据,其中也没有介绍多少,不过我们可以从其定义中可以领悟到一些差异。

      (1)IN关键字:该操作符IN用于把一个值与一个指定列表进行比较,当被比较的值至少与列表中的一个值相匹配时,它会返回TRUE。

      (2)EXISTS关键字:该操作符EXISTS用于搜索指定表里是否存在满足特定条件的记录。

      根据这两个关键字作用的描述,可知:若是IN子句或者EXISTS子句都是采用SELECT语法检索出来的结果列表进行匹配的话,那么在IN子句中还要将被比较值与结果列表做进一步的循环比较,当IN中的被比较值能够匹配到结果列表中某个值,那么IN子句就会返回TRUE,否则的话就会返回FALSE;而在EXISTS子句中,若SELECT语句检索的结果值不为空,那么EXISTS子句直接将该结果集返回,若是检索的结果值为空的,那么EXISTS子句就返回空,也就是说EXISTS子句返回的就是SELECT语句返回的结果集,不需要再次做比较判断了。

    -- IN
    SELECT column1
    FROM table_name
    WHERE some_col IN (SELECT column1 FROM table_name WHERE other_col > 'xx');
    
    
    -- EXISTS
    SELECT column1
    FROM table_name
    WHERE EXISTS (SELECT column1 FROM table_name WHERE other_col > 'xx');

      上述代码示例只是一个象征性的对比说明,在同一个表中进行不同条件的多次检索,使用IN的方式:先根据条件检索出数据,然后some_col与结果列表进行循环比较;使用EXISTS的方式:先根据条件检索出数据,然后将该结果集直接返回,作为最终的数据结果了。由此可见,IN和EXISTS子句耗时不在于SELECT检索的时间,而是在于其自身所消耗的时间。所以在IN子句中,若动态的结果集数据量比较大的话,还是建议使用EXISTS子句来替换。

  • 相关阅读:
    WINCE基于CH7024实现TV OUT (VGA)功能
    Hello China操作系统在Virtual PC上的安装和使用
    内心独白之程序员思维
    物联网操作系统的架构和基本功能
    说不懂Android系统构架,太亏了!
    Hello China V1.75版本运行截图
    剥开ios 系统sandbox神秘面纱
    Android基础之广播
    《大象Thinking in UML 第二版》已于近日在当当首发,同时邀请各位加入新浪微博[大象thinkinginUml群]:http://q.weibo.com/1483929
    物联网操作系统随笔
  • 原文地址:https://www.cnblogs.com/bien94/p/12892184.html
Copyright © 2011-2022 走看看