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值对执行结果不会有什么影响。

  • 相关阅读:
    九省联考2018 解题报告
    「PKUSC2018」最大前缀和(状压dp)
    「雅礼集训 2017 Day2」解题报告
    UVA10829 L-Gap Substrings(后缀数组+ST表)
    [BZOJ2738]矩阵乘法(整体二分+二维树状数组)
    「雅礼集训 2017 Day1」 解题报告
    LeetCode 190. Reverse Bits (算32次即可)
    LeetCode 437. Path Sum III (STL map前缀和)
    LeetCode 744. Find Smallest Letter Greater Than Target (时间复杂度O(n))
    LeetCode 1. Two Sum (c++ stl map)
  • 原文地址:https://www.cnblogs.com/abclife/p/5939140.html
Copyright © 2011-2022 走看看