2019-08-30-数据库的三值逻辑

数据库的三值逻辑

一直不知道数据库中还有第三种逻辑,即truefalseunknown
由于关系型数据库引入了NULL的存在,所以不得不引入第三种逻辑的存在。所以为什么sql中是" IS NULL " 而不是 " = NULL “,” IS NULL " 一个整体更应该看做为谓词,而不应把NULL看做为一个值。
NULL既不是值也不是变量,它只是一个表示 "没有值"的标记,而比较谓词只能适用于值。因此对非值的NULL使用比较运算是没有意义的。即得到的结果是unknown

--以下的式子都会被判定为unknown
1.= NULL
2.> NULL
3.< NULL
4.<> NULL
5.NULL = NULL

真值表:

  • NOT
xNOT x
tf
uu
ft
  • AND
ANDtuf
ttuf
uuuf
ffff
  • OR
ORtuf
tttt
utuu
ftuf

真值优先级符合以下顺序:

  • and的情况:false>unknown>true
  • or的情况:true>unknown>false

书中拾慧:
在sql中只存在一种NULL,然而在讨论NULL的时候,我们一般会将它分成两种类型来思考。
即:“未知”(unkonwn)和“不适用”(not applicable)。
比如,“这个人戴了墨镜,不知道他的眼睛是什么颜色”,这个人的眼睛肯定是有颜色的,但是如果不摘掉墨镜,别人就不知道他的眼睛是什么颜色,这叫“未知”;
“不知道冰箱的眼睛长什么颜色”则属于“不适用”。“不适用”这种情况更多的接近“无意义”,而不是“不确定”。
总结:“未知”指的是“虽然现在不知道,但加上某些条件后就可以知道”;而“不适用”指的是“无论怎么努力都无法知道”。
关系模型之父Codd曾认为应该严格区分这两种类型的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值是相等的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值