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