zoukankan      html  css  js  c++  java
  • NULL对反连接的影响

    测试准备:

    create table t1(col1 number,col2 varchar2(1));
    create table t2(col2 varchar2(1),col3 varchar2(2));
    insert into t1 values(1,'A');
    insert into t1 values(2,'B');
    insert into t1 values(3,'C');
    insert into t2 values('A','A2');
    insert into t2 values('B','B2');
    insert into t2 values('D','D2');
    commit;
    
    SQL> set autot on
    SQL> select * from t1 where col2 not in (select col2 from t2);
    
          COL1 C
    ---------- -
             3 C
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1275484728
    
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     3 |    51 |     6   (0)| 00:00:01 |
    |*  1 |  HASH JOIN ANTI NA |      |     3 |    51 |     6   (0)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL| T1   |     3 |    45 |     3   (0)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| T2   |     3 |     6 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
    SQL> select * from t1 where col2 <> all (select col2 from t2);
    
          COL1 C
    ---------- -
             3 C
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1275484728
    
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     3 |    51 |     6   (0)| 00:00:01 |
    |*  1 |  HASH JOIN ANTI NA |      |     3 |    51 |     6   (0)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL| T1   |     3 |    45 |     3   (0)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| T2   |     3 |     6 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
    SQL> select * from t1 where not exists (select 1 from t2 where col2=t1.col2);
    
          COL1 C
    ---------- -
             3 C
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2706079091
    
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     3 |    51 |     6   (0)| 00:00:01 |
    |*  1 |  HASH JOIN ANTI    |      |     3 |    51 |     6   (0)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL| T1   |     3 |    45 |     3   (0)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| T2   |     3 |     6 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
    SQL> 
    

      

    如果T1表中col2有null值:

    insert into t1(col1) values('4');
    commit;
    
    SQL> select * from t1 where col2 not in (select col2 from t2);
    
          COL1 C
    ---------- -
             3 C
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1275484728
    
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     4 |    68 |     6   (0)| 00:00:01 |
    |*  1 |  HASH JOIN ANTI NA |      |     4 |    68 |     6   (0)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL| T1   |     4 |    60 |     3   (0)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| T2   |     3 |     6 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
    SQL> select * from t1 where col2 <> all (select col2 from t2);
    
          COL1 C
    ---------- -
             3 C
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1275484728
    
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     4 |    68 |     6   (0)| 00:00:01 |
    |*  1 |  HASH JOIN ANTI NA |      |     4 |    68 |     6   (0)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL| T1   |     4 |    60 |     3   (0)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| T2   |     3 |     6 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
    SQL> select * from t1 where not exists (select 1 from t2 where col2=t1.col2);
    
          COL1 C
    ---------- -
             4
             3 C
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2706079091
    
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     4 |    68 |     6   (0)| 00:00:01 |
    |*  1 |  HASH JOIN ANTI    |      |     4 |    68 |     6   (0)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL| T1   |     4 |    60 |     3   (0)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| T2   |     3 |     6 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
    SQL> 
    

      

    如果T2中col2有null值:

    delete from t1 where col1=4;
    insert into t2(col3) values('E2');
    commit;
    
    SQL> select * from t1 where col2 not in (select col2 from t2);
    
    no rows selected
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1275484728
    
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     3 |    51 |     6   (0)| 00:00:01 |
    |*  1 |  HASH JOIN ANTI NA |      |     3 |    51 |     6   (0)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL| T1   |     3 |    45 |     3   (0)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| T2   |     4 |     8 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
    SQL> select * from t1 where col2 <> all (select col2 from t2);
    
    no rows selected
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1275484728
    
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     3 |    51 |     6   (0)| 00:00:01 |
    |*  1 |  HASH JOIN ANTI NA |      |     3 |    51 |     6   (0)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL| T1   |     3 |    45 |     3   (0)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| T2   |     4 |     8 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
    SQL> select * from t1 where not exists (select 1 from t2 where col2=t1.col2);
    
          COL1 C
    ---------- -
             3 C
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2706079091
    
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     3 |    51 |     6   (0)| 00:00:01 |
    |*  1 |  HASH JOIN ANTI    |      |     3 |    51 |     6   (0)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL| T1   |     3 |    45 |     3   (0)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| T2   |     4 |     8 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
    SQL> 
    

      

    not in、<> all对null值敏感,即not in、、<> all后面的子查询或者常亮集合一旦有null值出现,整个sql的执行结果就为null。
    not exists对null值不敏感,即null值对执行结果不会有什么影响。

  • 相关阅读:
    JS 、JQ 获取宽高总结 & JS中getBoundingClientRect的作用及兼容方案
    JS与JQ 获取页面元素值的方法和差异对比
    ES6
    移动端:active伪类无效的解决方法
    JavaScript中valueOf函数与toString方法
    Reverse Words in a String -- LeetCode
    Count Primes -- LeetCodes (primality test)
    Maximum Size Subarray Sum Equals k -- LeetCode
    Subsets II -- LeetCode
    Maximum Product of Word Lengths -- LeetCode
  • 原文地址:https://www.cnblogs.com/abclife/p/5939140.html
Copyright © 2011-2022 走看看