sql server 2008 NULL值

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值,就像有具体值的列一样;

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐