在SQL刚入门的时候,我们筛选为某列值为NULL的行,一般会采用如下的方式:

SELECT * FROM Table AS T WHERE T.Col=NULL

而实际上此种写法无法得到想要的结果。此时我们在网上找到的解决方法是采用:T.Col IS NULL。虽然此方法能得到数据,但是本人以及部分同行都不知道为什么会出现 T.Col=NULL 无法得到Col为NULL的行的这种结果。

  最近我想加强下SQL方面的知识,于是找了 SQLSERVER 2005技术内幕:T-SQL查询 这本书看。在书中看到了三值逻辑个知识点。而该知识点为我解惑了上面的问题。

  什么是三值逻辑?

  以下是书中原文:
  在SQL中逻辑表达式的可能值包括TRUE、FALSE和UNKNOWN。它们被称之为三值逻辑。三值逻辑是SQL所特有的。大多数编程语言的逻辑表达式只有TRUE或FALSE两种值。SQL中的UNKNOWN逻辑值通常出现在包含NULL值的逻辑表达式中,例如,下面这三个表达式值都是UNKNOWN:

NULL<42;
NULL=NULL;
X+NULL>Y;

NULL值通常表示丢失或不相关的值。当比较丢失值和另外一个值(这个值也可能是NULL)时,逻辑结果总是UNKNOWN。

  处理UNKNOWN逻辑结果和NULL时非常容易混淆。NOT TRUE等于FALSE,NOT FALSE等于TRUE,而否定的UNKNOWN(NOT UNKNOWN)还是UNKNOWN。

  UNKNOWN逻辑结果和NULL在不同的语言元素中被区别对待。例如,所有的查询筛选器(ON、WHERE和HAVING)都把UNKNOWN当作FALSE处理。使筛选器为UNKNOWN的行会被排除在结果集之外,而CHECK约束中的UNKNOWN值被当作TRUE对待。建设表中包含一个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值排列在一起。

  了解UNKNOWN逻辑结果和NULL在不同的语言元素中被处理的方式是有好处的,这样可以避免以后出现麻烦。

  一大堆密密麻麻的字,都晕了吧。我用通俗点的解释下。

  用C#语言举例,C#中条件表达式的值是true和false。但是在SQL中还有第三种条件值:unknown。

  在C#中 if(null==null)得到结果是true,不等于的时候是false。

  但是在SQL使用 =、<、>、<>、<=、>= 进行 null值判断的时候,不会得到预期的truefalse,而是unknown。

  SQL对unknown 的处理主要分为两种:

  1、在 where、on、having子句中,把unknown当着false处理。于是就有了开篇中我的那个疑问了。

  2、在check约束中的unknown值被当作TRUE对待。建设表中包含一个check约束,要求salary列的值必须大于0,向该表插入salary为null时可以被接受,因为(null>0)等于unknown,在check约束中被视为和true一样。

  根据上面的解释,已经知道了为什么在查询中筛选null的时候需要使用 is null 或者is not null ,常规条件表达式却无法筛选出。

关于SQL\SQL Server的三值逻辑的更多相关文章

  1. VS2010在网络共享目录使用IntelliSense、ipch、sdf和SQL Compact Server相关问题

    Microsoft SQL Compact Server 是专用于 Visual Studio 的单机SQL 数据库.数据库文件名的后缀为SDF. 而VS2010 拒绝在网络共享目录中建立和打开SDF ...

  2. sql: sql developer tunnel转接

    Use putty tunnel instead of login terminal server 有时候本地直接ping不通sql 的server, 但另一个server能连上,这时就可以把端口和i ...

  3. [SQL]SQL类似统计功能的sql文

    declare @t table(name varchar(),type int) insert into @t union all union all union all union all if ...

  4. pl/sql sql窗口允许输出和允许变量替换

    pl/sql sql窗口允许输出和允许变量替换 允许输出:类似在命令窗口中输入的 setserveroutput on; 允许变量替换:如果点击了这个,类似于执行 set define off命令 在 ...

  5. 关于SQL\SQL Server的三值逻辑简析

    在SQL刚入门的时候,我们筛选为某列值为NULL的行,一般会采用如下的方式: SELECT * FROM Table AS T WHERE T.Col=NULL  www.2cto.com   而实际 ...

  6. sql server 执行上100mb sql sql sql server 无法执行脚本 没有足够的内存继续执行

    cmd osql -S 服务器名称 -E  -i sql文件路径 ------------------------------------------------------ 最近遇到一个问题,在sq ...

  7. [SQL] SQL Server 触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  8. Spark SQL Thrift Server 配置 Kerberos身份认证和权限管理

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 之前的博客介绍了通过Kerberos + Sentry的方式实现了hive server2的身份认证和权限管理功能,本文主 ...

  9. [SQL] SQL SERVER基础语法

    Struct Query Language 1.3NF a.原子性 b.不能数据冗余 c.引用其他表的主键 2.约束 a.非空约束 b.主键约束 c.唯一约束 d.默认约束 e.检查约束 f.外键约束 ...

随机推荐

  1. SpringBoot 出现Whitelabel Error Page 解决办法

    这是咋了,咋的就404了 我路径也挺对的啊 注解也都写上了啊 咋就找不到了呢? debug吧它不进方法 看日志吧,他还不报错 这家伙给我急的 百度一下午也没解决,最后还是看官网才知道错在了那里,程序只 ...

  2. 生活实遇记-Kindle好久没用,屏幕一直处于电池状态,怎么解决?

    2018-01-02 实遇记-Kindle好久没用,屏幕一直处于电池状态,怎么解决? 今天我翻腾出自己的kindle,好久没用了,屏幕一直是一个电池状态,充电头+线充了2个钟头,按电源键木有反应,也是 ...

  3. Linux命令:unlias

    语法 unalias [-a] name [name ...] 说明 取消别名. 可以一次取消多个别名,写几个取消几个.不写,取消所有别名. 参数 -a 取消所有别名,不论后面是否跟一个还是多个nam ...

  4. java学习--"==”和 equals

    ==  比较的是两个值是否相等 这里的值有可能是基础类型的值,也有可能是指向对象的引用 equals方法如何比较,要看这个类的equals方法是如何定义的 基类Object类的equals方法比较的是 ...

  5. linux下启动tomcat服务

     Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/local ...

  6. MySQL存储过程定义中的特性(characteristic)的含义

    MySQL的存储过程蛮啰嗦的,与MSSQL或者Oracle的存储过程相比,如果没有显式指定,他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程 通常在使用图形界面工具进行存 ...

  7. 用 Python + itchat 写一个爬虫脚本每天定时给女朋友发微信暖心话

    https://github.com/sfyc23/EverydayWechat.git

  8. cdnbest 节点和主控连接不上原因主要查看几点

    1. 注意安装过程中有没有报错,如果没有报错,检查下节点程序是否有运行,本例以linux系统为例,windows系统可以查看进程管理器 有以下进程说明程序是运行成功的 ps -aux |grep ka ...

  9. Tomcat常用设置及安全管理规范

    前言 随着公司内部使用Tomcat作为web应用服务器的规模越来越大,为保证Tomcat的配置安全,防止信息泄露,恶性攻击以及配置的安全规范,特制定此Tomcat安全配置规范.注意:  本文章从htt ...

  10. Hands-On Unity 2018 x 移动游戏开发教程

    Hands-On Unity 2018 x Game Development for Mobile 使用Unity 2018.2创建具有出色游戏功能的精彩游戏   想学习在Unity制作游戏,但不知道 ...