zoukankan      html  css  js  c++  java
  • sql exist和in的区别及查询效率比较

    如说两张表一张是用户表TDefUser(userid,address,phone),一张是消费表TAccConsume(userid,time,amount),我要查消费超过5000的用户记录,那么我可以写 

    Java代码  
    select   *   from   TDefUser where   exists   (select   1   from   TAccConsume   where   TDefUser.userid=TAccConsume.userid   and   TAccConsume.amount> 5000)  
    也可以写 
    Java代码  
    select   *   from   TDefUser where   userid   in   (select   userid   from   TAccConsume   where   TAccConsume.amount> 5000)   
     
    select   1   代表什么意思呢? 
    ============== 
    师傅说因为exists只返回真或假,select   1   可以提高效率。 
     
    exists()后面的子查询被称做相关子查询   他是不返回列表的值的.只是返回一个ture或false的结果(这也是为什么子查询里是 "select   1 "的原因   当然也可以select任何东西) 
    其运行方式是先运行主查询一次   再去子查询里查询与其对应的结果   如果是ture则输出,反之则不输出.再根据主查询中的每一行去子查询里去查询. 
     
    in()后面的子查询   是返回结果集的,换句话说执行次序和exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出. 
     
    可是我不太知道exists的执行过程是怎么样的 
    ------------------------------------------ 
    执行顺序如下: 
    1.首先执行一次外部查询 
    2.对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当前行的值。 
    3.使用子查询的结果来确定外部查询的结果集。 
    如果外部查询返回100行,SQL   就将执行101次查询,一次执行外部查询,然后为外部查询返回的每一行执行一次子查询。但实际上,SQL的查询 
    优化器有可能会找到一种更好的方法来执行相关子查询,而不需要实际执行101次查询。
     
    有人说:能用左连接做掉的事情,尽量不要去用exists,in之类的 
     
    又有人说:exists的性能比外连接更好,曾用过做数十万数据量的查询,exists大概比外连接快30%左右 
     
    还有人说:如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in;反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists
    web开发网http://www.software8.co/wzjs/mysql/2077.html
  • 相关阅读:
    idHTTP使用代理IP
    Delphi的TRegistry注册表类方法详解
    判断WebBrowser是否加载完成.
    vs2010 安装记
    Delphi中destroy, free, freeAndNil, release用法和区别
    IdHTTP处理HTTP 302遇到的问题
    passcal 多线程例子,线程管理,创建,暂停,中止,等待等。。。
    passcal try嵌套
    passcal 编写多线程程序
    用一个 Byte 数表示 8 个复选框的选择状态
  • 原文地址:https://www.cnblogs.com/wwwroot/p/2833999.html
Copyright © 2011-2022 走看看