你真的会玩SQL吗?让人晕头转向的三值逻辑
你真的会玩SQL吗?系列文章
- 你真的会玩SQL吗?之逻辑查询处理阶段
- 你真的会玩SQL吗?和平大使 内连接、外连接
- 你真的会玩SQL吗?三范式、数据完整性
- 你真的会玩SQL吗?查询指定节点及其所有父节点的方法
- 你真的会玩SQL吗?让人晕头转向的三值逻辑
- 你真的会玩SQL吗?EXISTS和IN之间的区别
- 你真的会玩SQL吗?无处不在的子查询
- 你真的会玩SQL吗?Case也疯狂
- 你真的会玩SQL吗?表表达式,排名函数
- 你真的会玩SQL吗?简单的数据修改
- 你真的会玩SQL吗?你所不知道的 数据聚合
- 你真的会玩SQL吗?透视转换的艺术
- 你真的会玩SQL吗?冷落的Top和Apply
- 你真的会玩SQL吗?实用函数方法汇总
- 你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(上)
- 你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(下)
先来看一个问题:a not in (b,c,null),返回什么?
是不是有时辛辛苦苦写了个查询,但显示的不是想要的答案?让我们来看看其中的一个陷阱。
我们筛选为某列值为NULL的行,一般会采用如下的方式:select * from tb where col=null
但这无法得到我们想要的结果的,正确的方式是col is null 为什么呢?这就涉及到三值逻辑。
三值逻辑
在SQL中逻辑表达式的可能值包括TRUE、FALSE和UNKNOWN。它们被称之为三值逻辑。
三值逻辑是SQL所特有的。大多数编程语言的逻辑表达式只有TRUE或FALSE两种值。
SQL中的UNKNOWN逻辑值通常出现在包含NULL值的逻辑表达式中,例如,下面这三个表达式值都是UNKNOWN:
NULL<42; NULL=NULL; X+NULL>Y;
UNKNOWN值也是确定的,只是不同情况下有时为true有时为false,一个总原则是:UNKNOWN值非真即假,非假即真,UNKNOWN只能取true和false中的一个,但UNKNOWN的相反还是UNKNOWN
在on\where和having中做过滤条件时,UNKNOWN看作false,在check中被看作true,在条件中两个null比较结果是UNKNOWN。(建设表中包含一个CHECK约束,要求salary列的值必须大于0,向该表插入salary为NULL时可以被接受,因为(NULL>0)等于UNKNOWN,在check约束中被视为和TRUE一样)
在筛选器中比较两个NULL值将得到UNKNOWN,它会被当作false处理,就好像其中一个NULL不等于另一个NULL。
而UNIQUE约束。排序操作和分组操作认为两个NULL值是相等的。
如果表中有一列定义了UNIQUE约束,将无法向表中插入该列值为NULL的两行。
GROUP BY 子句把所有NULL值分到一组。
ORDER BY 子句把所有NULL值排列在一起。
知道了为什么在查询中筛选null的时候需要使用 is null 或者is not null ,常规条件表达式却无法筛选出?
练习
以下对就返回哪三值?
答案
作者:欢醉
公众号【一个码农的日常】 技术群:319931204 1号群: 437802986 2号群: 340250479
出处:http://zhangs1986.cnblogs.com/
码云:https://gitee.com/huanzui
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:http://www.cnblogs.com/zhangs1986/p/4914823.html
相关推荐
-
使用 apt-p2p 搭建本地 Debian 软件包缓存 服务器
2019-3-10
-
java实现kubernates的api访问—Fabric8 服务器
2020-6-21
-
Jenkins API 使用 服务器
2019-5-3
-
【运维经】第1章——vim列编辑 服务器
2020-6-10
-
awk 入门 —— 强大的文本分析工具 服务器
2020-5-25
-
virtio 简介 服务器
2019-4-2
-
【软件周刊】JetBrains 为 .NET 推出 Rider;Vue.js 要当版本帝?And 开源中国安卓客户端更新啦! 服务器
2020-6-8
-
linux文件操作 服务器
2019-9-10
-
CentOS 7.4 安装 K8S v1.11.0 集群所遇到的问题 服务器
2019-5-23
-
nginx 反向代理进行yum配置 服务器
2019-10-13