你真的会玩SQL吗?让人晕头转向的三值逻辑

简介: 你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接、外连接 你真的会玩SQL吗?三范式、数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节点的方法 你真的会玩SQL吗?让人晕头转向的三值逻辑 你真的会玩SQL吗?EXISTS和...

你真的会玩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 ,常规条件表达式却无法筛选出?

练习

以下对就返回哪三值?

答案

View Code
目录
相关文章
|
4月前
|
SQL 缓存 数据处理
SQL执行方式
【7月更文挑战第22天】SQL执行方式
31 2
|
SQL 关系型数据库 MySQL
|
SQL Oracle Java
使用 SQL NOWAIT 的最佳方式
由于所有的主要数据库都支持此功能,Hibernate提供了一个NOWAIT选项,可以在不同数据库上调用这个功能,而且不影响代码的数据库可移植性。
336 0
|
SQL 关系型数据库 MySQL
SQL语句优化方法
SQL语句优化方法
168 0
|
SQL 索引
说说对SQL语句优化有哪些方法?
说说对SQL语句优化有哪些方法?
110 0
一行SQL代码能做什么?(上)
最近在知乎上看到一个问题:一行代码可以做什么?答题者数万计,都是一些非常“高端”的操作,就在想一行SQL代码能做什么呢?
一行SQL代码能做什么?(上)
|
SQL XML 数据库
一行SQL代码能做什么?(下)
最近在知乎上看到一个问题:一行代码可以做什么?答题者数万计,都是一些非常“高端”的操作,就在想一行SQL代码能做什么呢?
一行SQL代码能做什么?(下)
|
SQL XML 数据库
一行SQL代码能做什么?(下)
最近在知乎上看到一个问题:一行代码可以做什么?答题者数万计,都是一些非常“高端”的操作,就在想一行SQL代码能做什么呢? SQL一行代码其实有很多很多,一些常见的比如: SELECT * FROM TableName INSERT INTO TableName VALUES(...) TRUNCATE TABLE TableName ..... 这些就没什么意思了,我们来给大家看一些比较“高级”的。
一行SQL代码能做什么?(下)
一行SQL代码能做什么?(上)
最近在知乎上看到一个问题:一行代码可以做什么?答题者数万计,都是一些非常“高端”的操作,就在想一行SQL代码能做什么呢? SQL一行代码其实有很多很多,一些常见的比如: SELECT * FROM TableName INSERT INTO TableName VALUES(...) TRUNCATE TABLE TableName ..... 这些就没什么意思了,我们来给大家看一些比较“高级”的。
一行SQL代码能做什么?(上)
|
SQL XML 数据库
一行SQL代码能做什么?
一行SQL代码能做什么?
一行SQL代码能做什么?