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子句来替换。

  • 相关阅读:
    matlab中用来批量读取的dir函数
    cat 函数应用
    线性移不变系统
    为什么低频信息描述了图像在光滑部位的整体灰度信息,而高频部分则反映了图像在边缘、噪声等细节方面的表现?
    红灯检测宇视科技专利分析与总结2
    红灯检测宇视科技专利分析与总结1
    matlab中冒号的用法
    第一篇博文,大橙子的博客生涯要开始啦
    Spring Boot和Shiro整合
    Spring Boot + Redis使用短信平台发送验证码(腾讯云短信平台)
  • 原文地址:https://www.cnblogs.com/bien94/p/12892184.html
Copyright © 2011-2022 走看看