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;
結論
# ,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