三值逻辑:

真、假和“不确定值”

三值逻辑和布尔型类型的区别:

普通布尔类型只有true和false两个值,这种逻辑体系被称为二值逻辑。
在SQL语言中还有第三个值:unknown。这种逻辑体系被称为三值逻辑

数据库为什么引入三值逻辑:

问题在于NULL。关系型数据库里引入了NULL,所以不得不同时引入第三个值。

两种NULL

一种:未知(unknown),一种:不适用(applcable)。
未知:虽然现在不知道的数据,添加某些语句筛选出来一些数据。
不适用:无论怎么努力都无法知道的。

NULL与比较谓词比较:

NULL与比较谓词比较后的结果总是unknown。
因为查询结果只会包含where字句里的判断结果为true的行。不会包含false和unknown的行。

– 以下的式子都会被判为 unknown
1 = NULL
2 > NULL
3 < NULL
4 <> NULL
NULL = NULL

为什么NULL使用比较谓词后的结果永远不可能为真?

因为NULL既不是值也不是变量。NULL字还是一个表示”没有值“没有值的标记,而比较谓词只适用于值。因此,对并非值的NULL使用比较谓词本来就是没有意义的。

排中律:

把“命题”和他的“否命题”通过或者连接起来而成的命题全都是真命题。这个命题在二值逻辑中被称为排中律。顾名思义就是对命题的真伪判定未非黑即白,也是古典逻辑学的重要原理。
但排中律在SQL中是不成立的。

select * from Students
where age = 20 or age <>20;

注:结果中约翰这条记录时查询不出来的

NOT IN和NOT EXISTS不是等价的

in 和 exists 在某种程度上他们是可以替换的。经常用exists提升SQL性能。

但NOT IN 改成NOT EXISTS,结果未必一样。

NOT IN 中的入职参数如果有NULL的话,返回结果一定为UNKNOWN。
而NOT EXISTS则会返回false(因为exists的结果只包含false和true)

同样,机制函数在统计时,会直接将为NULL的数据直接排除掉。

返回值为NULL的函数:

当输入为空时:极值函数、聚合函数除COUNT以外的聚合函数(count有count()和count(列名)两种使用方法,count()可以统计所有行,count(列名)则会跳过null值)。返回值都为NULL。

小结:

  1. NULL 不是值。
  2. 因为 NULL 不是值,所以不能对其使用谓词。
  3. 对 NULL 使用谓词后的结果是 unknown 。
  4. unknown 参与到逻辑运算时,SQL 的运行会和预想的不一样。
  5. 按步骤追踪 SQL 的执行过程能有效应对 4 中的情况。
    最后说明一下,要想解决 NULL 带来的各种问题,最佳方法应该是往 表里添加 NOT NULL 约束来尽力排除 NULL 。这样就可以回到美妙的 二值逻辑世界(虽然并不能完全回到)。

SQL三值逻辑和NULL相关推荐

  1. SQL进阶之路03:三值逻辑和NULL

    大多数的编程语言都是基于二值逻辑(true,false),而SQL语言采用为三值逻辑(true,false,'unknown'),而这个不确定因素常常导致查询结果并不是理想中的结果.总之存在null那 ...

  2. MICK-SQL进阶教程 1.3 三值逻辑和NULL

    让自己愈发觉得自己学艺不精的一章... 要点: 三值逻辑:true, false, unknown 必须写成"IS NULL",而不是"= NULL":对 NU ...

  3. oracle sql判断值为空,Oracle,sqlserver的空值(null)判断

    Oracle,sql server的空值(null)判断 sqlserver 替换null: isnull(arg,value) 如:selectisnull(price,0.0)fromorders ...

  4. sql 语句中的 NULL值

    今天写了这样的代码 DECLARE @atr NVARCHAR(20) SET @atr = NULL IF(@atr = NULL) BEGIN   PRINT 1 END     原本是想打印出1 ...

  5. oracle sql为null值,在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办

    在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1.MSSQL: ISNULL() 语法 ISNULL ( check_expression , replacem ...

  6. 如何让SqlParameter的值为null 传入SQL

    如何让SqlParameter的值为null 传入SQL kuui_chiu 2013-12-31 20:01:18  5119  收藏 展开 cmd.parameters.add("@ID ...

  7. 解决 sql 语句正确,日志打印正确,但是在mapper测试中返回值为 NULL

    解决 sql 语句正确,日志打印正确,但是在mapper测试中返回值为 NULL

  8. 如何在SQL分组查询时将空白值和NULL值分为一组

    问题背景 出现这个问题的原因是在测试过程中,对于我要分组的类型在不同人存数据时出现了空白值和NULL两种情况(胡闹!),导致我之前的分组查询会出现NULL一个分组,空白值一个分组,由于业务上的需求是没 ...

  9. SQL Server中的null(没有值,空值)

    零.码仙励志 命运是不存在的,它不过是失败者拿来逃避现实的借口 一.建库和建表 create database scort use scort create table emp (empno int ...

最新文章

  1. 用python画玫瑰花代码-python绘制玫瑰的实现代码
  2. mysql 优化表 3000万_mysql优化:专题三、关于单表查询,可以这么优化
  3. live的domain服务
  4. node-red教程 7dashboard简介与输入型仪表板控件的使用
  5. 不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤
  6. RocketMQ源码解析-Consumer启动(2)
  7. 2017蓝桥杯B组:取数位(递归,求余和除法)
  8. 自定义EasyUI图标样式
  9. 账龄分析表excel模板_华为财务EXCEL内训手册(共131套模板,带公式).xls
  10. mysql里查询中文条件_Mysql对中文查询条件出现的问题
  11. 一次 Kafka 导致的 Sentry 无法处理 MiniDump 问题分析
  12. 2011浙江省公务员考试申论大作文的写作
  13. PS:高清晰度的源文件保存成图片如何使图片大小最小
  14. name = STXingkai/OT, rootname = STXingkai/OT LaTex Package fontspec Error报错解决
  15. WITH AS 用法 (说实话,WITH AS还真是简单)
  16. 计算机桌面显示如何关闭,几个小方法教你如何关闭笔记本电脑的屏幕但保持电脑运行!...
  17. 启发式算法与元启发式算法的区别
  18. 数据库怎么设计字典表
  19. c语言程序设计实践万年历,c语言程序设计万年历-20210408030342.docx-原创力文档
  20. 12c oracle 修改内存_Oracle 12C 内存数据库测试

热门文章

  1. 亚马逊云免费服务器安装教程AWS微软系统教程含Tomcat,mysql,Tomcat去项目名,端口名!
  2. BloomFilter
  3. 解决google play三件套无法连接到互联网、保护机制认证、商店无法进入等常见问题
  4. 【python】取txt文件中的单词存到SQLite数据库,并且从bing词典爬取单词详情
  5. oracle的opm,Oracle OPM Demo流程
  6. 3D模型欣赏:原始部落女神 自带仙气 让人眼前一亮
  7. Kotlin 密封类代替枚举类
  8. 今天,你成为这1/1000000了吗
  9. N后问题详解(回溯法)--Java实现
  10. 华为od统一考试B卷【5键键盘】Java 实现