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

  • 相关阅读:
    随机变量与概率分布
    概率知识归纳
    随机生成&部门匹配
    SudokuGame 记软工第二次作业
    从0到1的开发,社交App 完成
    Emmm,从删库到跑路系列之.......Root权限的重要性
    处理AsyncTask的内存泄漏问题
    关于服务器端的Json文件的接收,踩了一早上的坑的问题
    一些安卓模拟器的IP问题和getOutputStream();关于connect();的函数异常的问题
    擦擦博客的灰------开始毕设,社交应用开发 之 前期准备
  • 原文地址:https://www.cnblogs.com/bien94/p/12892184.html
Copyright © 2011-2022 走看看