null是什么?

不晓得。作者是说,他的意思正是不明白(unknown)。

它和true、false组成谓词的八个逻辑值,代表“未知”。与true和false相比较,null最麻烦令人捉摸,因为它并未有鲜明性的值,在差异的光景下,它能表示不一致的意义。下文以例子的形式给大家享受下null使用的出色气象及相应的用法。

1.check约束与null

事情发生早先在SQL ServerCentral.com上收看叁个有关check约束的null难点,

威澳门尼斯人36366com,作者成立了二个表,在字段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的行不会现出在结果聚集。

终极,准确答案是:只会回来两行

威澳门尼斯人36366com 1

 

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

 

 

3.1Not In与null

在底下那些查询中,where子句中利用not
in来过滤数据,where子句的尺度是OrderStatus not in
(‘Active’,’InActive’卡塔尔,大家希望结果集中蕴含orderstatus为’Not
Active’、’NULL’这两行的数目。

select * from orders where OrderStatus not in ('Active','InActive')

以此查询中,当OrderStatus为null时, 原where子句等价于where null
<>’Active’ O翼虎 
null<>’InActive’,这就成为了上文中介绍的可比运算与null的主题材料。where的判定结果仍旧null,所以该行不会并发在结果聚焦。而当OrderStatus为’Not
Active’时,满足where筛选的为true的尺度,会彰显在结果凑集。

最终,正确答案是:独有少年老成行。

威澳门尼斯人36366com 2

证实:in与null的涉嫌与此同理。

 

3.2Not exists与null

方今大家依然愿意结果聚焦包涵orderstatus为’Not
Active’、’NULL’这两行的数额,此番用Not exists。

在这里个查询中,子查询先求出OrderStatus=’Active’ or 
OrderStatus=’InActive的行,然后外界查询用not
exists过滤子查询的结果,将剩余的行展现在最后结果聚焦。

SELECT *FROM orders AS o1WHERE NOT EXISTS(          SELECT *         FROM orders AS o2         WHERE o1.OrderStatus = o2.OrderStatus          AND ( o2.OrderStatus = 'Active'            OR o2.OrderStatus = 'InActive'            ));

 

威澳门尼斯人36366com 3

 

为了便于领会,大家将子查询改写成自表连接的办法,

select * from orders as o2 where o1.OrderStatus=o2.OrderStatus and (o2.OrderStatus='Active' or o2.OrderStatus='InActive' ))

改写成:

SELECT *FROM orders AS o2   INNER JOIN orders o1 ON o1.OrderStatus = o2.OrderStatus             AND ( o2.OrderStatus = 'Active'              OR o2.OrderStatus = 'InActive'               );

回来的结果集为:

威澳门尼斯人36366com 4

下一场大家再看外层查询,

外表查询期待利用not
exists重返orders表中不包涵子查询结果集的行,也正是说,只要orders表未有子查询结果集中的行就回来true,不然重回false(独有存在和不设有,未有unknown的布道)。

坚决守护那一个逻辑,orderID为3和4的行不在子查询的结果聚集,因而not
exists决断为true,而orderID为1和2的行已包括在子查询的结果集中,所以not
exists决断为false。最终依照where筛选“选用true,拒却false和null”的基准,最终独有orderID为3和4的行呈现在结果聚集。

威澳门尼斯人36366com 5

注解:exists与null的涉嫌与此同理。

 

3.3Not  in和Not exists的区别

not
in实际上是对贰个对象的相比运算,而正如存在true|false|unknow二种逻辑值。

not
exsits推断有个别对象存在也许不真实,它唯有那二种情况,未有unknown的说教。由此看待not
in来说,not exists只会有true和false那三种逻辑值。

 

总结:

上文介绍了null在不一样情形中的含义,思考到SQL差别的语言因素对null的两样管理方式,平日大家在写SQL语句的时候应该明晰思考自个儿编排的每一种查询对null或三值逻辑的拍卖,幸免现身逻辑错误。

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注