数据库 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 值 如果表中的某个列是可选的,那么我们可以在不 ...
随机推荐
- Hbase常用命令
转:http://lib.csdn.net/article/hadoop/33499
- JBPM4入门——8.等待节点的分支执行
JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...
- linux 下安装flash player
或者直接下载:i386系统wget http://linuxdownload.adobe.com/adobe-release/adobe-release-i386-1.0-1.noarch.rpmrp ...
- AE 中的查找与定位,以城市查找为例
在文本框输入一个城市,在地图上查找,当找到后让mapcontrol自动跳转到地图上该点. IQueryFilter filter = new QueryFilterClass(); filter.Wh ...
- ORA-12516: TNS: 监听程序无法找到匹配协议栈的可用句柄解决方法
1.查看当前连接进程数SQL>select count(*) from v$process;2.查看连接数上限SQL>select value from v$parameter where ...
- 将war包布署在本地tomcat上
1.把war包解压到..webapps目录下 2. 修改server.xml文件,在host节点中添加 <Context docBase="C:\Users\bai\Desktop\s ...
- android 性能优化大纲
性能优化系列 分为三个部分:视图篇 逻辑篇 和代码规范篇 . ------2016/9/6 视图篇 主要涵盖视图树层级优化.自定义视图.图片优化,常用布局性能缺陷等多个方面 .把平常经常 ...
- Linux操作系统中,.zip、.tar、.tar.gz、.tar.bz2、.tar.xz、.jar、.7z等格式的压缩与解压
zip格式 压缩: zip -r [目标文件名].zip [原文件/目录名] 解压: unzip [原文件名].zip 注:-r参数代表递归 tar格式(该格式仅仅打包,不压缩) 打包:tar -cv ...
- How To Set Up Port Forwarding in Linux
Port forwarding usually used when we want our computer act like a router. Our computer receive the p ...
- Arduino uno R3 ISP刷Rootloader for arduino pro mini
找了好久才发现的,好东西.介绍怎么使用uno对mini 刷Rootloader **SOLUTION** Reinstall the Arduino Pro Mini Bootloader using ...