SQL Server null知多少?

发表于:2016-3-09 10:51

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:i6first    来源:51Testing软件测试网采编

  null是什么?
  不知道。我是说,他的意思就是不知道(unknown)。
  它和true、false组成谓词的三个逻辑值,代表“未知”。与true和false相比,null最难以令人捉摸,因为它没有明确的值,在不同的场景下,它能代表不同的含义。下文以例子的方式给大家分享下null使用的典型场景及对应的用法。
  1.check约束与null
  之前在SQL ServerCentral.com上看到一个关于check约束的null问题,
  作者创建了一个表,在字段orderstatus上设置了check约束,只能插入指定的value的行,现在插入几行数据,其中有一行的value为null,最后问最终有几行可以插入成功。
  原文如下:
I want to ensure that the status column for my Orders table only contains specific values. I decide to use this code:
create table Orders
( OrderID int primary key
, OrderTotal MONEY
, OrderStatus VARCHAR(20)
constraint Orders_Status_Code check( OrderStatus in ('ACTIVE', 'INACTIVE', 'TBD'))
);
go
Now I want to insert data into the table. I run this batch.
insert Orders select 1, 435.43, 'Active'
insert Orders select 2, 554.66, 'InActive'
insert Orders select 3, 129.12, 'Not Active'
insert Orders select 4, 1228.00, NULL
How many rows are in the table? I am running on a default, SQL Server 2014 instance with US English defaults.
  (大家先想想答案,如果没有把握就找个测试环境试一试)
  《T-SQL基础教程》中关于check约束与null的描述,著者用了一句言简意赅的口诀“check约束拒绝false,接受true和null”。
  在上面的例子中,当orderstatus为‘Avative’和’InActive’时,check约束判断的结果是true,所以会插入成功,当为'Not Active’判断的结果为false,插入不成功,最后当为'Null’时,判断的结果是null,插入成功。
  所以,正确答案是3。
  2.比较运算与null
  null一个特殊性在于它无法比较(和计算)。null与任何值的任何比较(和计算)都等于null。(unique约束除外,在unique约束中,null是相等的,同一个字段不允许出现两次null)
  比如判断null=null的结果是null,判断null<>null的结果也还是null。下面我以不等于(<>)为例,演示比较运算对null的判断。
  我先创建一个表,然后插入多行数据,其中有一行orderstatus的值为null,
if object_id(N’Orders’) is not null drop table orders
create table Orders
( OrderID int primary key
, OrderTotal MONEY
, OrderStatus VARCHAR(20)
);
go
insert Orders select 1, 435.43, 'Active'
insert Orders select 2, 554.66, 'InActive'
insert Orders select 3, 129.12, 'Not Active'
insert Orders select 4, 1228.00, NULL
  现在我执行了一个where orderstatus<>'Active' 的查询,
  select * from orders where OrderStatus<>'Active'
  大家想想null所在的行会不会在查询结果里面。
  在上面的例子中,当orderstatus为'InActive' 和'Not Active' 时,where条件判断的结果为true,但当orderstatus为'null' 时,where OrderStatus<>'Active'等价于where null <>'Active',而null与任何一个值的比较结果还是null,所以where条件判断的结果为null。
  在SQL Server中,where筛选的原则是“接受true,拒绝false和null”(《T-SQL基础教程》)。所以orderstatus为'InActive' 和'Not Active'的行显示在结果集总,而orderstatus为null的行不会出现在结果集中。
  最终,正确答案是:只会返回两行
  3.Not in与null和Not exists与null
  not in和not exists都可以用来判断某个对象的存在与否,在大多数场景下两者可以相互替换,但在遇到null时,因为前者是三值逻辑(true|false|unknow)判断而后者只会返回true或false,因此处理的结果会有很大不同。
  为了演示两者的区别,我们还是沿用上文的表,分别使用not in和not exists执行一个查询,找出OrderStatus 不为'Active'和'InActive'的行。
if object_id(N’Orders’) is not null drop table orders
create table Orders
( OrderID int primary key
, OrderTotal MONEY
, OrderStatus VARCHAR(20)
);
go
insert Orders select 1, 435.43, 'Active'
insert Orders select 2, 554.66, 'InActive'
insert Orders select 3, 129.12, 'Not Active'
insert Orders select 4, 1228.00, NULL
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号