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
  • 相关阅读:
    《Django By Example》第十二章(终章) 中文 翻译 (个人学习,渣翻)
    《Django By Example》第十一章 中文 翻译 (个人学习,渣翻)
    《Django By Example》第十章 中文 翻译 (个人学习,渣翻)
    《Django By Example》第九章 中文 翻译 (个人学习,渣翻)
    《Django By Example》第八章 中文 翻译 (个人学习,渣翻)
    《Django By Example》第五章 中文 翻译 (个人学习,渣翻)
    我的superui开源后台bootstrap开发框架
    LayoutInflater 总结
    Android屏幕分辨率概念(dp、dip、dpi、sp、px)
    android studio安装问题
  • 原文地址:https://www.cnblogs.com/wwwroot/p/2833999.html
Copyright © 2011-2022 走看看