mssql sqlserver sql not in 和in 并不能包含所有结果


摘要:
下文讲述sqlserver中not in和in 关键字的相关说明,如下所示:
实验环境:sql server 2008 r2



在sqlserver的布尔判读中,与其它变成语言不同,sqlserver的布尔计算会产生三种不同的布尔计算结果:
true, false,unknown

在sqlserver中,当一个值同null进行等值判断,if(2==null)则返回一个unknown值。
在sqlserver中,unknown值主要为处理NULL的比较,在sqlserver中null表示此数据缺失,不包含任何值的定义,null值不是数值零也不是一个零长度的字符串。
正是由于这种三值逻辑情况的存在,所以not in和in 之外还有一种unknown的值存在。

三值逻辑带来的异常

由于存在第三个unknown值的存在,所以我们在平常的开发中,要特别注意各种判断
例:

   ----下面拥有 证件号码、姓名、性别 3列,其中只有性别可以为NULL,如下:
CREATE TABLE  [maomao] (
  cardNo varchar(18) NOT NULL primary key,
  name  nvarchar(20) NOT NULL,
  sex int   NULL
);

---插入测试数据
insert into [maomao]
(cardNo,name,sex)
values
('440306198511107188','sqlblog',1),
('440306198511109300',N'sql爱好者',0),
('440306198511105641',N'sql最佳实践',1),
('440306198511102766','猫猫小屋',null),
('440306198511101704','爱好者',null)
go

---获取性别为男和女的信息
select * from [maomao] 
where sex in (0,1)

---取not in 值
select * from [maomao] 
where sex  not  in (0,1)
  
go
truncate table [maomao]
drop      table [maomao]


注意事项:
在not in查询中,并没有把sex为null值所在行数据显示出来,
因为当sex值为null时,布尔值返回UNKNOWN,此值既不是false,也不是true,
所以我们在平常子查询中要注意数据是否存在null数值,在数据库表设计前期,避免数据出现null值