谓词逻辑

在 SQL 中,实现的是三值谓词逻辑。

通常一个命题要么为 TRUE,要么就为 FALSE。

而在 SQL 中,它用 NULL 符号来表示缺少值。

SQL的谓词的计算机结果可以是TRUE、FALSE或UNKNOWN(未知)。

如果逻辑表达式只涉及已经存在的值,那么最终的计算机结果要么为TRUE,要么为FALSE;但是当逻辑表达式涉及缺少的值时,其计算机结果就是 UNKNOWN。

例如:考虑谓词 a>0:当a等于1000时,表达式计算结果为TRUE ;当a等于-1000时,表达式计算结果为FALSE;当a是NULL时,表达式的计算机结果就是UNKNOWN。

在不同的语言无素中,SQL 对 UNKNOWN的处理也有所不同(对于一些人来说,不一定是他们原本期望的方式)。SQL对查询过滤条件的正确定义是:“接受TRUE”就意味着要过滤掉FALSE和UNKNOWN。反之,SQL对CHECK约束处理的正确定义是:“拒绝FALSe”就意味着要接受TRUE和UNKNOWN。如果SQL使用的是二值谓词逻辑,那么“接受TRUE”和“拒绝FALSE”就不会有什么区别。但在三值谓词逻辑中,“接受TRUE”则会拒绝UNKNOWN(接爱TRUE,因而要拒绝FALSE和UNKNOWN),而“拒绝FALSE”则会接受UNKNOWN(拒绝FALSe,因而要接受TRUE和UNKNOWN)。

UNKNOWN的一个微妙之处是当对它取反(negate)时,结果仍然是UNKNOWN。

对两个NULL值进行比较的表达式(NULL=NULL),其计算机结果也竟为UNKNOWN。因为NULL值代表的是一个缺少的值或不可知的值,所以实际上无法判断一个不可知的值是否等于另一个。

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

例如,当进行分组和排序时,认为两个NULL值是相等的。也就是说,GROUP BY子句会在每个组中重新组织所有的NULL值,就像有具体值的列一样;ORDER BY子句也会对所有NULL值进行排序。至于NULL值应该排在有效值之前还是之后,ANSI SQL把它留给了具体的产品实现。T-SQL 是把NULL值排在了有效值之前。

ANSI SQL有两种UNIQUE约束:一种将多个NULL值视为相等的(只允许一个NULL值),另一个则将多个NULL值视为不同的(允许有多个NULL值)。SQL只实现了前者。

 

posted @ 2014-05-02 00:11  守护之翼  阅读(476)  评论(0编辑  收藏  举报