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

  • 相关阅读:
    保持简单----纪念丹尼斯•里奇(Dennis Ritchie)
    转:有关retina和HiDPI那点事
    Powershell 学习
    Windows与Linux共享文件夹互相访问
    你知道C语言为什么会有“_”(下划线)吗?
    百度公共DNS
    AXIS2的一些认识
    待整理
    java复习汇总之面试篇
    落网歌曲图片下载
  • 原文地址:https://www.cnblogs.com/abclife/p/5939140.html
Copyright © 2020-2023  润新知