NULL值引入导致新增的unknown逻辑值 以及 SQL server中ANSI_NULLS的使用
部分参考文章:
https://www.bbsmax.com/A/A7zgEOVl54/ [BBSMAX]Lumia1020 2022-11-08
https://www.cnblogs.com/SFAN/p/4343703.html cnblogs @ sunnyboy 2015-03-17 10:17
wikipedia三值逻辑:https://zh.wikipedia.org/wiki/%E4%B8%89%E5%80%BC%E9%80%BB%E8%BE%91
SET ANSI_NULLS (Transact-SQL):https://learn.microsoft.com/zh-cn/sql/t-sql/statements/set-ansi-nulls-transact-sql?redirectedfrom=MSDN&view=sql-server-ver16
NULL :在 C#、Java 语言中,NULL 作为一个值(引用类型字段默认初始值,注意区别 NULL、空字符串区别),代表未指向内存堆空间中任何对象(此处,就不在细讲,可以去详细了解一下基本类型、引用类型在内存堆栈上存储区别)。而在数据库中,NULL 同样作为一个值,其含义可以理解为:NULL 表示该字段值不知道,而并不是代表字段没有值。
下表来自维基百科,有关 NULL、TRUE、FALSE 参与 OR AND 非运算逻辑结果

IS NULL、IS NOT NULL
平时在写 SQL 语句时,注意 = NULL、<> NULL 应为 IS NULL、IS NOT NULL,避免出现不必要错误。
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 值且不重复的行记录。
SET ANSI_NULLS ON
当 ANSI_NULLS 为 ON 时,即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。 即使 column_name 中包含非空值,使用 WHERE column_name<>NULL 的 SELECT 语句仍返回零行。
当 ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵守 ISO 标准。 使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中包含空值的行。 使用 WHERE column_name<>NULL 的 SELECT 语句返回列中包含非空值的行。 此外,使用 WHERE column_name<>XYZ_value 的 SELECT 语句返回所有不为 XYZ_value 也不为 NULL 的行 。
当 ANSI_NULLS 为 ON 时,所有对 null 值的比较均取值为 UNKNOWN。 当 SET ANSI_NULLS 为 OFF 时,如果数据值为 NULL,则所有数据对空值的比较将取值为 TRUE。 如果未指定 SET ANSI_NULLS,则应用当前数据库的 ANSI_NULLS 选项设置。 有关 ANSI_NULLS 数据库选项的详细信息,请参阅 ALTER DATABASE (Transact-SQL)。
下表显示 ANSI_NULLS 的设置如何通过 NULL 值和非 NULL 值影响大量布尔表达式的结果。
| 布尔表达式 | SET ANSI_NULLS ON | SET ANSI_NULLS OFF |
|---|---|---|
| NULL = NULL | UNKNOWN | TRUE |
| 1 = NULL | UNKNOWN | FALSE |
| NULL <> NULL | UNKNOWN | FALSE |
| 1 <> NULL | UNKNOWN | TRUE |
| NULL > NULL | UNKNOWN | UNKNOWN |
| 1 > NULL | UNKNOWN | UNKNOWN |
| NULL IS NULL | TRUE | TRUE |
| 1 IS NULL | FALSE | FALSE |
| NULL IS NOT NULL | FALSE | FALSE |
| 1 IS NOT NULL | TRUE | TRUE |
仅当某个比较操作数是值为 NULL 的变量或文字 NULL 时,SET ANSI_NULLS ON 才会影响比较。 如果比较双方是列或复合表达式,则该设置不会影响比较。
为使脚本按预期运行,不管 ANSI_NULLS 数据库选项或 SET ANSI_NULLS 的设置如何,请在可能包含空值的比较中使用 IS NULL 和 IS NOT NULL。
在执行分布式查询时应将 ANSI_NULLS 设置为 ON。
针对计算列或索引视图创建或更改索引时,ANSI_NULLS 也必须为 ON。 如果 SET ANSI_NULLS 为 OFF,则针对表(包含计算列或索引视图的索引)的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。 SQL Server 将返回一个错误消息,该错误消息会列出所有违反所需值的 SET 选项。 另外,在执行 SELECT 语句时,如果 SET ANSI_NULLS 为 OFF,则 SQL Server 忽略计算列或视图的索引值并解析选择操作,就好像表或视图没有这样的索引一样。
Transact-SQL 支持在与空值进行比较时,允许比较运算符返回 TRUE 或 FALSE。
通过设置 ANSI_NULLS OFF 可将此选项激活。
当 ANSI_NULLS 为 OFF 时,
如果 ColumnA 包含 Null 值,则 ColumnA = NULL 之类的比较操作会返回 TRUE;
如果 ColumnA 除了包含 NULL 外还包含某些值,则这类比较操作将返回 FALSE。
比较计算结果为 NULL 的两个表达式也会返回 TRUE。
ANSI_NULLS 设置不影响包含 NULL 的联接列。联接列中包含 NULL 的行不是结果集的一部分。
NULL值引入导致新增的unknown逻辑值 以及 SQL server中ANSI_NULLS的使用的更多相关文章
- SQL 之 SQL server 中 遇到字段的值为null 遇到的坑
SQL server 中,如果查询或筛选的条件中,某字段的值为NULL,如何处理?又有哪些坑需要避免呢? 直接上坑 : NULL 与其他任何类型进行逻辑判断: [解释]: NULL表示值未知,和空字符 ...
- sql server中NULL导入decimal字段时报错
sql server中NULL导入decimal字段时报错 在导入CSV文件时,如果decimal字段为null值,导致文本文件入库时失败. 错误现象 构造例子 新建一张表,包含decimal字段. ...
- SQL Server中TOP子句可能导致的问题以及解决办法
简介 在SQL Server中,针对复杂查询使用TOP子句可能会出现对性能的影响,这种影响可能是好的影响,也可能是坏的影响,针对不同的情况有不同的可能性. 关系数据库中SQL语句只 ...
- SQL SERVER中什么情况会导致索引查找变成索引扫描
SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结合上下文具体场景做了下测试.总结.归纳. 1:隐式转换会导致 ...
- SQL Server中可能为null的变量逻辑运算的时候要小心
DECLARE @a int declare @b int IF(@a<>@b) print('@a<>@b') else print('@a=@b') ) print('b& ...
- SQL Server中NULL的一个测试
我们都知道SQL Server中NULL是一个很特殊的存在,因为NULL不会等于任何值,且NULL也不会不等于任何值.对于NULL我们只能使用IS或IS NOT关键字来进行比较. 我们先来看看下面一个 ...
- SQL SERVER 中is null 和 is not null 将会导致索引失效吗?
其实本来这个问题没有什么好说的,今天优化的时候遇到一个SQL语句,因为比较有意思,所以我截取.简化了SQL语句,演示给大家看,如下所示 declare @bamboo_Code varchar(3); ...
- SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析
在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index ...
- SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的一种解决方案
parameter sniff问题是重用其他参数生成的执行计划,导致当前参数采用该执行计划非最优化的现象.想必熟悉数据的同学都应该知道,产生parameter sniff最典型的问题就是使用了参数化的 ...
- .NET和SQL Server中“空值”辨析 (DBNull与Null的区别)
对表进行插入操作,如datetime和int类型的两个字段,都允许为null,用“sqlcmd.Parameters.Add("@t12",tb12.Text)”参数绑定时.dat ...
随机推荐
- 基于CentOS Stream 8的物联网数据采集与展示方案
系统架构全景图 图表 一.系统平台优化(CentOS Stream 8) 1. 系统基础配置 bash # 1. 系统更新与加固 sudo dnf update -y sudo dnf install ...
- CF650A 题解
Problem 原题链接 Meaning 求曼哈顿距离和欧氏距离相等的坐标组数量. Solution 这道题用枚举复杂度较高,我们考虑探究当两点的曼哈顿距离与欧氏距离相等时,它们横纵坐标的关系. 如下 ...
- Xamarin.Android 禁止横屏 /竖屏
this.RequestedOrientation = Android.Content.PM.ScreenOrientation.Portrait;//竖屏,禁止横屏 this.RequestedOr ...
- SqlServer 查看所有触发器信息的命令
https://blog.csdn.net/chenghaibing2008/article/details/45332993 SELECT object_name(a.parent_ob ...
- C# winfrom 通过代码 控件 TableLayoutPanel的行或列 删除 隐藏
删除 tableLayoutPanel1.ColumnStyles.RemoveAt(1); tableLayoutPanel1.Controls.RemoveAt(1) ...
- 485集线器 4口485集线器 4口485 HUB
485集线器ZLAN9440是一款上海卓岚生产的可通过一路RS485/232主口扩展出4路RS485从口的工业级隔离型4口RS485集线器.可以有效的实现RS485网络的中继.扩展与隔离.ZLAN94 ...
- 微信小程序 物联网解决方案
"卓岚物联"微信小程序是方便地查看物联网设备当前数据.历史数据.控制设备的简单有效的方法.查看和控制设备的实现可以在五分钟内完成,简单易用."卓岚物联"微信程序 ...
- nginx代理http2服务
NGINX 不支持HTTP/2 到后端(至少目前nginx v1.27.1不支持),这从官方文档中可以看出,支持后端的最高 HTTP 版本为 v1.1. 其实添加此类支持实际上没有什么意义,因为HTT ...
- 调试栈 linux
参考连接 bluez 中有对于backtrace 的使用.所以看了一下这篇文章比较好.转载了 参考:CSDN大牛
- python 将数组写入文件
简介 常用功能 code import numpy as np import time test_data = np.random.rand(6000000,12) T1 = time.time() ...