SQL三值逻辑和NULL
三值逻辑:
真、假和“不确定值”
三值逻辑和布尔型类型的区别:
普通布尔类型只有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。
小结:
- NULL 不是值。
- 因为 NULL 不是值,所以不能对其使用谓词。
- 对 NULL 使用谓词后的结果是 unknown 。
- unknown 参与到逻辑运算时,SQL 的运行会和预想的不一样。
- 按步骤追踪 SQL 的执行过程能有效应对 4 中的情况。
最后说明一下,要想解决 NULL 带来的各种问题,最佳方法应该是往 表里添加 NOT NULL 约束来尽力排除 NULL 。这样就可以回到美妙的 二值逻辑世界(虽然并不能完全回到)。
SQL三值逻辑和NULL相关推荐
- SQL进阶之路03:三值逻辑和NULL
大多数的编程语言都是基于二值逻辑(true,false),而SQL语言采用为三值逻辑(true,false,'unknown'),而这个不确定因素常常导致查询结果并不是理想中的结果.总之存在null那 ...
- MICK-SQL进阶教程 1.3 三值逻辑和NULL
让自己愈发觉得自己学艺不精的一章... 要点: 三值逻辑:true, false, unknown 必须写成"IS NULL",而不是"= NULL":对 NU ...
- oracle sql判断值为空,Oracle,sqlserver的空值(null)判断
Oracle,sql server的空值(null)判断 sqlserver 替换null: isnull(arg,value) 如:selectisnull(price,0.0)fromorders ...
- sql 语句中的 NULL值
今天写了这样的代码 DECLARE @atr NVARCHAR(20) SET @atr = NULL IF(@atr = NULL) BEGIN PRINT 1 END 原本是想打印出1 ...
- oracle sql为null值,在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办
在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1.MSSQL: ISNULL() 语法 ISNULL ( check_expression , replacem ...
- 如何让SqlParameter的值为null 传入SQL
如何让SqlParameter的值为null 传入SQL kuui_chiu 2013-12-31 20:01:18 5119 收藏 展开 cmd.parameters.add("@ID ...
- 解决 sql 语句正确,日志打印正确,但是在mapper测试中返回值为 NULL
解决 sql 语句正确,日志打印正确,但是在mapper测试中返回值为 NULL
- 如何在SQL分组查询时将空白值和NULL值分为一组
问题背景 出现这个问题的原因是在测试过程中,对于我要分组的类型在不同人存数据时出现了空白值和NULL两种情况(胡闹!),导致我之前的分组查询会出现NULL一个分组,空白值一个分组,由于业务上的需求是没 ...
- SQL Server中的null(没有值,空值)
零.码仙励志 命运是不存在的,它不过是失败者拿来逃避现实的借口 一.建库和建表 create database scort use scort create table emp (empno int ...
最新文章
- 用python画玫瑰花代码-python绘制玫瑰的实现代码
- mysql 优化表 3000万_mysql优化:专题三、关于单表查询,可以这么优化
- live的domain服务
- node-red教程 7dashboard简介与输入型仪表板控件的使用
- 不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤
- RocketMQ源码解析-Consumer启动(2)
- 2017蓝桥杯B组:取数位(递归,求余和除法)
- 自定义EasyUI图标样式
- 账龄分析表excel模板_华为财务EXCEL内训手册(共131套模板,带公式).xls
- mysql里查询中文条件_Mysql对中文查询条件出现的问题
- 一次 Kafka 导致的 Sentry 无法处理 MiniDump 问题分析
- 2011浙江省公务员考试申论大作文的写作
- PS:高清晰度的源文件保存成图片如何使图片大小最小
- name = STXingkai/OT, rootname = STXingkai/OT LaTex Package fontspec Error报错解决
- WITH AS 用法 (说实话,WITH AS还真是简单)
- 计算机桌面显示如何关闭,几个小方法教你如何关闭笔记本电脑的屏幕但保持电脑运行!...
- 启发式算法与元启发式算法的区别
- 数据库怎么设计字典表
- c语言程序设计实践万年历,c语言程序设计万年历-20210408030342.docx-原创力文档
- 12c oracle 修改内存_Oracle 12C 内存数据库测试
热门文章
- 亚马逊云免费服务器安装教程AWS微软系统教程含Tomcat,mysql,Tomcat去项目名,端口名!
- BloomFilter
- 解决google play三件套无法连接到互联网、保护机制认证、商店无法进入等常见问题
- 【python】取txt文件中的单词存到SQLite数据库,并且从bing词典爬取单词详情
- oracle的opm,Oracle OPM Demo流程
- 3D模型欣赏:原始部落女神 自带仙气 让人眼前一亮
- Kotlin 密封类代替枚举类
- 今天,你成为这1/1000000了吗
- N后问题详解(回溯法)--Java实现
- 华为od统一考试B卷【5键键盘】Java 实现