• exists,in的区别-mysql


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

    select   *   from   TDefUser where   exists   (select   1   from   TAccConsume   where   TDefUser.userid=TAccConsume.userid   and   TAccConsume.amount> 5000)
    

     也可以写:

    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 

  • 相关阅读:
    Java中的流
    多种日志收集工具比较
    UML类图几种关系的总结
    从数组中找出第K大的数
    数组各种排序算法和复杂度分析
    时间复杂度和空间复杂度
    Java Classloader原理分析
    WebSocket
    TCP/IP详解--TCP连接中TIME_WAIT状态过多
    TCP协议
  • 原文地址:https://www.cnblogs.com/guochunguang/p/4212888.html
Copyright © 2020-2023  润新知