首页 > 代码库 > 关于数据库中的三值逻辑(Tree-Value-Logic)
关于数据库中的三值逻辑(Tree-Value-Logic)
在sql中,逻辑表达式(也叫做谓词),可以有三种值:True、False、Unknown,这就是所谓的三值逻辑,,是sql的特有属性。
在大多数编程语言中,逻辑表达式只有两个值,就是True和False,但是在sql中,还有Unknown。Unknown一般出现在含null的逻辑表达式中,比如下面的情况:NULL>2、NULL+X>Y、NULL=NULL。得到的结果都是Unknown。NULL这个符号代表一种缺失的值,当把一个缺失的值和另外的值拿来比较的时候,就会得到Unknown的结果。
在某些时候,Unknown和NULL在处理上很容易混淆,比如下面的情况:not true等于false,not false等于true,但是Unknown的反面还是Unknown。
在不同的语言元素中(也就是在sql语句中,不同的模块),Unknown逻辑结果和NULL处理方式也不相同。
1、在查询筛选器中(on、where、having)都把Unknown当做false来处理
2、在Check约束中,Unknown则被当做true对待,比如在表中某字段有Check约束,那么这个表不可能含有2行甚至以上的该字段值为Unknown的行。
3、在筛选器中,如果比较两个NULL值,虽然得到的值是Unknown,但是还是会当做False来处理。
4、在Unique约束、集合运算(如Union和Except)、排序、分组操作中,认为两个NULL值是相等的。
⑴这样一来,在有Unique约束的列中,无法向表中插入该列值为NULL的两行
⑵group by子句会将所有的null值分到一组,同理order by子句会将所有值为NULL的数据排列到一起
⑶当比较两个集合中的行时,集合运算符认为不同的NULL值是相等的。
基本上阅读《技术内幕-T-SQL》一书得到的笔记,如有错误请指正,谢谢。
关于数据库中的三值逻辑(Tree-Value-Logic)