exist和in

exist适合 子查询中表数据大于外查询表中数据的业务场景
in:适合外部表数据大于子查询的表数据的业务场景

  • in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
  • in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的

两者在sql中执行的差别:

  • exist: 先执行外部查询语句,然后在执行子查询,子查询中它每次都会去执行数据库的查询,执行次数等于外查询的数据数量。查询数据库比较频繁(记住这点),如果b表再id上加了索引也会走索引
  • in: 先查询 in()子查询的数据(1次),并且将数据放进内存里(不需要多次查询),然后外部查询的表再根据查询的结果进行查询过 滤,最后返回结果

    ANY关键字

    假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么,
    1. select ...from ... where a > any(...);
    2. ->
    3. select ...from ... where a > result1 or a > result2 or a > result3;

    ALL关键字

    ALL关键字与any关键字类似,只不过上面的or改成and。即:
    1. select ...from ... where a > all(...);
    2. ->
    3. select ...from ... where a > result1 and a > result2 and a > result3;

    SOME关键字

    some关键字和any关键字是一样的功能。所以:
    1. select ...from ... where a > some(...);
    2. ->
    3. select ...from ... where a > result1 or a > result2 or a > result3;