数据库 SQL :有关 NULL 值引发 TRUE、FALSE、UNKNOW 三值逻辑
在 Java、C# 中,相信如果是 boolean 类型值,只有两种选择 true、false。然而,在 SQL 查询中,NULL 值的引入,使得新增了 UNKNOW ,因此,就产生了 TRUE、FALSE、UNKNOW 三种选择。
NULL :在 C#、Java 语言中,NULL 作为一个值(引用类型字段默认初始值,注意区别 NULL、空字符串区别),代表未指向内存堆空间中任何对象(此处,就不在细讲,可以去详细了解一下基本类型、引用类型在内存堆栈上存储区别)。而在数据库中,NULL 同样作为一个值,其含义可以理解为:NULL 表示该字段值不知道,而并不是代表字段没有值。
下表来自维基百科,有关 NULL、TRUE、FALSE 参与 OR AND 非运算逻辑结果

测试脚本 SQL
DECLARE @Temp TABLE
(
ID INT IDENTITY PRIMARY KEY NOT NULL ,
NAME VARCHAR(50) NOT NULL,
[ADDRESS] VARCHAR(150) NULL,
MONEYDATA INT NULL
)
INSERT INTO @Temp
SELECT '张全蛋','台湾富土康',1000
UNION ALL
SELECT '唐马儒','广东东莞',2000
UNION ALL
SELECT '王尼玛',NULL,NULL SELECT * FROM @Temp ----- 查询为 NULL
SELECT * FROM @Temp WHERE [ADDRESS]=NULL --- 更改为 IS NULL ---- 查询不为 NULL
SELECT * FROM @Temp WHERE [ADDRESS]<>NULL --- 更改为 IS NOT NULL
1 IS NULL、IS NOT NULL
平时在写 SQL 语句时,注意 = NULL、<> NULL 应为 IS NULL、IS NOT NULL,避免出现不必要错误。

2 NULL 在聚合函数 SUM、COUNT、MAX、MIN 中处理
在数据库中,NULL 同样作为一个值,而 NULL 值进行四则运算时, NULL+1、NULL*2诸如之类,得到最终结果都为 UNKNOW。还有 NULL >23 等比较运算时,同样得到的结果为三值逻辑中的 UNKNOW。
综上所述,SUM、MAX、MIN 三者中都包括运算比较,在运算中如果 NULL 值参与其中,最终结果将为 UNKNOW。因此,在进行 SUM、MAX、MIN 聚合时,将会舍弃 NULL 值。
而 COUNT 较为特殊, COUNT(*) 将会包含有 NULL 值行记录,COUNT(字段名) 刚将不会包含该字段含有 NULL 值行记录,而 COUNT( DISTINCT 字段名)将舍弃该字段含有 NULL 值且不重复的行记录。
脚本 SQL
SELECT * ,
SUM(MONEYDATA) OVER() AS '统计工资总和',
MAX(MONEYDATA) OVER() AS '工资最高金额',
COUNT(*) OVER() AS '总员工数' ,
COUNT( ADDRESS) OVER() AS '地址不为 NULL 员工数'
FROM @Temp

3 NULL 值引发的分页问题
脚本 SQL
--- 使用 ROW_NUMBER() 实现分页
WITH TB AS
(
SELECT * ,ROW_NUMBER() OVER( ORDER BY MONEYDATA ASC) AS ROW FROM @Temp
)
SELECT * FROM TB A WHERE A.ROW BETWEEN (2-1)*1+1 AND 2*1; --- 使用 ORDER BY 、TOP 实现分页,而在 NOT IN 中如果字段出现 NULL 值,将会出现查询未果现象
---- 因为 NOT IN 可理解为
SELECT TOP 1 * FROM @Temp
WHERE ADDRESS NOT IN ( SELECT TOP ((2-1)*1) ADDRESS FROM @Temp ORDER BY MONEYDATA ASC )
ORDER BY MONEYDATA ASC

参考资料:https://zh.wikipedia.org/wiki/%E4%B8%89%E5%80%BC%E9%80%BB%E8%BE%91
数据库 SQL :有关 NULL 值引发 TRUE、FALSE、UNKNOW 三值逻辑的更多相关文章
- SQL中NULL值
SQL的表达式,除了IS NULL和NOT NULL以外,只要出现NULL值结果都为FALSE 简单的例子: SELECT * FROM table WHERE name!='abc' 只要name值 ...
- SQL SERVER NULL值和连接注意问题
联接表的列中的 null 值(如果有)互相不匹配.如果其中一个联接表的列中出现空值,只能通过外部联接返回这些空值(除非 WHERE 子句不包括空值). 下面的两个表中,每个表中要参与联接的列中均包 ...
- SQL Server NULL值用法及处理详解
用法如下: 1.如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录,这意味着该字段将以 NULL 值保存. 2.NULL 用作未知的或不适用的值的占位符. 3.定 ...
- 【转】Oracle索引列NULL值引发执行计划该表的测试示例
有时开发进行表结构设计,对表字段是否为空过于随意,出现诸如id1=id2,如果允许字段为空,因为Oracle中空值并不等于空值,有可能得到意料之外的结果.除此之外,最关键的是,NULL会影响oracl ...
- sql 将Null 值转化成空字符串
当Null + 任何字符串时,都等于Null. 因些用函数IsNull(字段名,''),如果字段名中的值是Null时,那么这个字段名的值是''. 例如::select code + IsNull('- ...
- sql处理null值
IFNULL(expr1,expr2) 如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2.IFNULL()返回一个数字或字符串值. select (case when ...
- SQL之NULL值的几种处理方式
1.创建测试表: drop table if exists tab_null_operator; create table tab_null_operator as select 1 as id,'c ...
- SQL NULL 值【摘自W3C】
SQL NULL 值 本章讲解 IS NULL 和 IS NOT NULL 操作符. NULL 值是遗漏的未知数据.默认地,表的列可以存放 NULL 值. 如果表中的某个列是可选的,那么我们可以在不向 ...
- SQL NULL 值
NULL 值是遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS NOT NULL 操作符. SQL NULL 值 如果表中的某个列是可选的,那么我们可以在不 ...
随机推荐
- yii2.0 url 跳转
//转发 $this->render('page1',['id'=>3,'mark'=>2]); //显示page1页面 并传递 id mark 2个参数 //重定向 $thi ...
- table 锁定表头,出滚动对齐
前一段时间来了一个汇总的需求,想锁定表头,这个问题在网上找了老半天,实现起来都比较麻烦,经过这几天的摸索终于找到一个简洁的处理方法 下面介绍一下如何处理的: 1.thead 和tbody 放两个tab ...
- jQuery autoComplete 样式
前提:使用了jQuery-ui 官网:http://jqueryui.com/autocomplete/ /*** autocomplete ***/ .ui-widget-content { bac ...
- 小结JS中的OOP(中)
此篇文章主要是提炼<JavaScript高级程序设计>中第六章的一些内容. 一:JS中OOP相关的概念 开始之前先总结JS中OOP相关的一些概念: 构造函数:JS中的构造函数就是普通的函数 ...
- swfupload 参数说明
一.配置参数对象中的常用属性及说明 属性 类型 默认值 描述 upload_url String 处理上传文件的服务器端页面的url地址,可以是绝对地址,也可以是相对地址,当为相对地址时相对的是当 ...
- js实现密码加密
http://www.cnblogs.com/mofish/archive/2012/02/25/2367858.html 1.base64加密 在页面中引入base64.js文件,调用方法为: &l ...
- Docker 基础技术:Linux Namespace(下)
导读 在Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中 ...
- 【LeetCode】237 & 203 - Delete Node in a Linked List & Remove Linked List Elements
237 - Delete Node in a Linked List Write a function to delete a node (except the tail) in a singly l ...
- Cassandra + Eclipse + Hadoop
配置好eclipse连接hadoop: 参考:http://www.powerxing.com/hadoop-build-project-using-eclipse/ http://blog.csdn ...
- linux库文件编写入门(笔记)
linux库文件的编写 作者: laomai地址: http://blog.csdn.net/laomai 本文主要参考了如下资料⑴hcj写的"Linux静态/动态链接库的创建和使用&quo ...