在SQL刚入门的时候,我们筛选为某列值为NULL的行,一般会采用如下的方式:
SELECT * FROM Table AS T WHERE T.Col=NULL  www.2cto.com  
而实际上此种写法无法得到想要的结果。此时我们在网上找到的解决方法是采用: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值分到一组。  www.2cto.com  
    ORDER BY 子句把所有NULL值排列在一起。
 
  了解UNKNOWN逻辑结果和NULL在不同的语言元素中被处理的方式是有好处的,这样可以避免以后出现麻烦。
 
  一大堆密密麻麻的字,都晕了吧。我用通俗点的解释下。
  用C#语言举例,C#中条件表达式的值是true和false。但是在SQL中还有第三种条件值:unknown。
  在C#中 if(null==null)得到结果是true,不等于的时候是false。
  但是在SQL使用 =、<、>、<>、<=、>= 进行 null值判断的时候,不会得到预期的true或false,而是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. SQL Server安全概念简析

    I. 登录名与用户名 登录名: 访问数据库服务器的账户.登录名可以登录到服务器,但不能直接访问数据库内容.数据库连接串中的用户名应配置为登录名.每个登录名的定义存放在master数据库的syslogi ...

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

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

  3. MySQL 慢查询日志配置与简析

    MySQL慢查询日志配置与简析 By:授客 QQ:1033553122   <1> 查看是否开启慢查询日志 SHOW VARIABLES LIKE 'slow%'; 说明: a. 如果sl ...

  4. ORACLE时间函数(SYSDATE)简析

    ORACLE时间函数(SYSDATE)简析 分类: 原文地址:ORACLE时间函数(SYSDATE)简析 作者:skylway 加法 select sysdate,add_months(sysdate ...

  5. Mysql中FIND_IN_SET()和IN区别简析

    来源:http://www.jb51.net/article/125744.htm 测试SQL: CREATE TABLE `test` ( `id` int(8) NOT NULL auto_inc ...

  6. 简析 .NET Core 构成体系

    简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...

  7. Android 启动过程简析

    首先我们先来看android构架图: android系统是构建在linux系统上面的. 所以android设备启动经历3个过程. Boot Loader,Linux Kernel & Andr ...

  8. sql: sql developer tunnel转接

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

  9. 简析TCP的三次握手与四次分手【转】

    转自 简析TCP的三次握手与四次分手 | 果冻想http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文 ...

随机推荐

  1. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  2. 怎样用sourceTree将自己本地的项目上传到github网站上

    前言:GitHub 是基于 Git 的一个代码托管网站.开发者可以将代码在 GitHub 上开源,可以浏览其它项目的代码. 准备工作:1.github网站账号.2.sourceTree软件. 一.在g ...

  3. asp.net <% %>,<%# %>,<%= %>,<%$ %>区别大集合

    前台页面 <div><%--可以执行服务器代码,相当于在后台写代码,Render%><%=取后台变量或方法值,只能绑定客户端控件,绑定服务器控件时后来必须调用databi ...

  4. 电脑升级完Xcode8后 注释快捷键无效的问题

    1.部分电脑升级完Xcode8 后直接重启电脑就可以使用Command +/ 快捷键注释代码, 2.如果上述方法没有效果,可以在终端输入sudo /usr/libexec/xpccachectl  然 ...

  5. iOS之多线程浅谈

    1)并发和并行的区别 在软件开发中不可避免的会遇到多线程的问题,在iOS客户端开发(或者.NET的winform或者wpf这样的cs程序)中就更不可避免的会用到多线程,在bs类型的web项目中要考虑一 ...

  6. Websocket协议数据帧传输和关闭连接

    之前总结了关于Websocket协议的握手连接方式等其他细节,现在对socket连接建立后的数据帧传输和关闭细节总结. 一.数据帧格式 数据传输使用的是一系列数据帧,出于安全考虑和避免网络截获,客户端 ...

  7. 不能将“const char [7]”转换为“LPCTSTR”

    試試用強制轉換變數型態的方法吧,像這樣(LPCTSTR)"WinSun",若不行再試L"WinSun",再不行試_L"WinSun".

  8. 【BZOJ】1012: [JSOI2008]最大数maxnumber 树状数组求区间最值

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1012 题意:维护一个数列,开始时没有数值,之后会有两种操作, Q L :查询数列末 ...

  9. 一步步学习NHibernate(2)——配置NHibernate的环境

    请注明转载地址:http://www.cnblogs.com/arhat 第二章 环境搭建 在上一章中,我们知道了NHibernate是用来干什么的了,那么今天在本章中,我们开始搭建NHibernat ...

  10. cocos2dx输出信息重定向到控制台

    重定向输出到控制台,方便调试,代码: // uncomment below line, open debug console #define USE_WIN32_CONSOLE int APIENTR ...