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.

  • 相关阅读:
    用Asp获取Dll加密新闻内容
    Silverlight编译范围
    c++连接mssql
    委托理解
    NClass,终于找到了可以绘制类图的工具了!
    RIATasks: A Simple Silverlight CRUD Example (using View Model)
    PetaPoco使用
    匿名方法,Action,Func以及lambda的区别
    第一个c++
    System.Threading中Thread和Task区别
  • 原文地址:https://www.cnblogs.com/ken-jl/p/8892795.html
Copyright © 2011-2022 走看看