欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

sql server 2008 NULL值

程序员文章站 2022-03-20 20:26:21
SQL支持用NULL符号来表示缺少的值,它使用的是三值谓词逻辑,计算结果可是以TURE、FALSE或UNKNOWN。 SQL中不同语言元素处理NULL和UNKNOWN的方式也有所不同,如果逻辑表达式只涉及已经存在的值,那么最终的计算结果只有二种,要么TRUE要么FALSE。但是当逻辑表达式涉及缺少的 ......

sql支持用null符号来表示缺少的值,它使用的是三值谓词逻辑,计算结果可是以ture、false或unknown。

sql中不同语言元素处理null和unknown的方式也有所不同,如果逻辑表达式只涉及已经存在的值,那么最终的计算结果只有二种,要么true要么false。但是当逻辑表达式涉及缺少的值时,其计算结果就是unknown。如,当谓词salary>0:当salary等于1000时,表达式结果为true,查询过滤条件(where和having子句)能够让表达式计算结果为true的那些行或组被返回;当salary等于-100时,表达式计算结果为false,查询过滤条件(where和having子句)能够让表达式计算结果为false的那些行或组被返回;当salary是null时,表达式的计算结果就是unknown,查询过滤条件(where和having子句)不返回任何行。

在不同的语言元素中,sql对unknown的处理也有所不同。sql对查询过滤条件处理的正确定义是:“接受true”就意味着要过滤掉false和unknown。反之,对sql对check约束处理的正确定义是:“拒绝false”就意味着接受true和unknown。如果sql使用的是二值谓词逻辑,那么“接受true”和“拒绝false”就不会有什么区别。但在三值谓词逻辑中,“接受true”则会拒绝unknown和false,而拒绝false则会接受unknown和true。前面的例子使用了谓词salary>0,一个取值为null的salary将导致表达式计算结果为unknown。如果这个谓词出现在查询的where子句中,则salary列取值为null的行也将会过滤掉。如果在表的check约束中也包含这个谓词条件,则salary列取值为null的行也将被过滤掉。

unknown对它取反时,结果还是unknown。两个null值进行比较的表达式,其计算结果还是unknown。因为null值代表一个缺少的值或不可知的值,为此sql提供了两个谓词is null和is not null,用来取代=null和<>null。

在用于比较和排序目的的不同元素中,sql处理null的方式也有所不同,一些元素认为两个null值彼此相等,而另一些则认为这它们不相等。

例如,当进行分组和排序时,认为二个null值是相等的。也就是说group by子句会在每个组中重新组织所有的null值,就像有具体值的列一样;