我是靠谱客的博主 故意爆米花,最近开发中收集的这篇文章主要介绍三值逻辑和NULL,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


对NULL使用比较谓词后得到的结果总是unknown,因为NULL既不是值也不是变量。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

优先级高的真值会决定计算结果


注意:

  • 比较谓词和NULL(1):排中律不成立(排中律就是指不认可中间状态,对命题真伪的判定黑白分明)

  • 比较谓词和NULL(2):CASE表达式和NULL

    -- 错误写法
    CASE col
    WHEN 1 THEN 'O'
    WHEN NULL THEN 'x'
    END
    -- 正确写法
    CASE WHEN col = 1 THEN 'O'
    WHEN col IS NULL THEN 'X'
    END
    -- 这种错误很常见,其原因是将NULL误解成了值,一定要牢记“NULL并不是值”
    

  • NOT IN 和 NOT EXISTS不是等价的

    如果NOT IN子查询中用到的表里被选择的列中存在NULL,则SQL语句整体的查询结果永远是空;

    EXISTS谓词永远不会返回unknown,只会返回true或false


  • 限定谓词和NULL

    SQL中有ALL和ANY两个限定谓词。因为ANY和IN是等价的,所以我们不常使用ANY,那么我们主要看一下更常用的ALL的一些注意事项:

    ALL可以与比较谓词一起使用,用来表达"与所有的xxx都相等",或"比所有的xxx都大"的意思

    -- 查询比B班住在东京的所有学生年龄都小的A班学生
    SELECT *
    FROM Class_A
    WHERE age < ALL (SELECT age
    FROM Class_B
    WHERE city = '东京');
    

    注意: ALL谓词其实是多个以AND连接的逻辑表达式的省略写法


  • 限定谓词和极值函数不是等价的(回归书本理解)

    -- 用极值函数改写上述代码
    SELECT *
    FROM Class_A
    WHERE age < (SELECT MIN(age)
    FROM Class_B
    WHERE city = '东京')
    -- 即使age的数据中有NULL也没有关系,因为极值函数会在统计时把为NULL的数据排除掉
    

    注意:极值函数在输入为空表(空集)时会返回NULL


  • 聚合函数和NULL

最后

以上就是故意爆米花为你收集整理的三值逻辑和NULL的全部内容,希望文章能够帮你解决三值逻辑和NULL所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部