zoukankan      html  css  js  c++  java
  • SQL IN, NOT IN, EXISTS, NOT EXISTS

    IN与EXISTS执行流程

    IN:在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。(IN时不对NULL进行处理)

    EXISTS:在查询的时候,遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。使用EXISTS关键字进行查询的时候,首先查询的不是子查询的内容,而是查主查询的表,

    如果两个表中一个较小,一个是大表,则子查询表大的用EXISTS,子查询表小的用IN:

    例如:表A(小表),表B(大表)
    1:
    SELECT * FROM A WHERE a IN (SELECT b FROM  B) 
    效率低,用到了A表上a列的索引;
    SELECT * FROM A WHERE EXISTS (SELECT b FROM B WHERE b=A.a) 
    效率高,用到了B表上b列的索引。

    2:
    SELECT * FROM B WHERE b IN (SELECT a FROM  A) 
    效率高,用到了B表上b列的索引;
    SELECT * FROM  B WHERE EXISTS (SELECT a FROM  A WHERE a=B.b) 
    效率低,用到了A表上a列的索引。

    IN与EXISTS应用场景

    IN和EXISTS的区别:

    如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用IN,

    反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。

    IN是把外表和内表作hash连接,而EXISTS是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为EXISTS比IN效率高的说法是不准确的。

    简易口诀:子查询相对小,用IN,否则用EXISTS.

    NOT IN与NOT EXISTS

    有了前面IN与EXISTS的分析,对NOT IN与NOT EXISTS就好理解了,

    如果查询语句使用了NOT IN,那么内外表都进行全表扫描,没有用到索引;

    而NOT EXISTS的子查询依然能用到表上的索引。

    所以无论那个表大,用NOT EXISTS都比NOT IN要快。

    简易口诀:否定用NOT EXISTS.

  • 相关阅读:
    滚动页面时DIV到达顶部时固定在顶部
    【Java学习笔记】拾遗
    【Java学习笔记】文件信息
    【Java学习笔记】使用BufferedReader类(流的读写)
    【Java学习笔记】可变参数
    【Java学习笔记】控制台读写
    【Java学习笔记】关于默认值
    【Java学习笔记】FileChannel的学习
    【JAVA学习笔记】静态导入
    【Java学习笔记】Java中关于tostring方法的误操作
  • 原文地址:https://www.cnblogs.com/ken-jl/p/8892795.html
Copyright © 2011-2022 走看看