null値のいくつかのテスト

2890 ワード

null値のいくつかのテスト


デモテーブル

drop table if exists p;
CREATE TABLE `p` (
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `p`  VALUES (' ');
INSERT INTO `p`  VALUES (' ');
INSERT INTO `p`  VALUES (' ');
INSERT INTO `p`  VALUES (NULL);
drop table if exists p2;
CREATE TABLE `p2` (
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

結論

  • の値は空のコレクションにありません.任意の値not in空セット==true、任意の値in空セット==false
  • 演算結果nullの場合false
  • とする.
    #  ,null false
    select * from p where null;
    select * from p where false;
    select * from p where true;
    
    # ( null) not in     true
    select name from p
    where p.name not in (select name from p2);
    
    # ( null) in     false
    select name from p
    where p.name in (select name from p2);
    
    # : 

    げんしょう

    select 'a' not in ('a', null); # 0
    select 'b' not in ('a', null); # null
    select null not in ('a', null); # null
    
    select 'a' in ('a', null); # 1
    select 'b' in ('a', null); # null
    select null in ('a', null); # null

    推測する

    select null not in ('a', null);
    # !(null = 'a' and null = null) 
    # !(null and null) 
    # null
    
    select null in ('a', null);
    # null = 'a' or null = null
    # null or null
    # null
    
    select 'a' not in ('a', null); #0
    # !('a' = 'a' or 'a' = null)
    # !(true or null)
    # false
    
    select 'a' in ('a', null); #1
    # 'a' = 'a' or 'a' = null
    # true or null
    # true
    
    select 'b' not in ('a', null);
    # !('b' = 'a' and 'b' = null)
    # !(false and null)
    # null
    select 'b' in ('a', null);
    # 'b' = 'a' or 'b' = null
    # false or null
    # null

    表1にあるが表2にnull値がない場合

    #  2 null 。 1 2 。
    select name from p where p.name not in (select name from p3);
    select name from p where p.name not in (' ', null);
    
    select name from p where p.name in (select name from p3);
    select name from p where p.name in (null, ' ');

    テーブル1にありますが、テーブル2にありません(null値はありませんが、テーブルが空の場合があります)


    null値が演算に関与する

    # null ,  null or true null。
    select null = null;
    select null != null;
    select null and true;
    select 1= null;
    select 1 != null;
    select 1 > null;
    select null or false;
    select null or null;
    select null in (null);
    select null not in (null);
    select !null;
    select count(1) from (select null = null) as T;
    
    #  null
    select null or true; #1
    select null is null; #1
    select null is not null; #0