SQL中IS NOT NULL与!=NULL的区别

SQL中IS NOT NULL与!=NULL的区别平时经常会遇到这两种写法:ISNOTNULL与!=NULL。也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合。实际上,是由于对二者使用区别理解不透彻。默认情况下,推荐使用ISNOTNULL去做条件判断,因为SQL默认情况下对WHEREXX!=Null的判断会永远返回0行,却不会提示语法错误。这是为什么呢?SQLServer文档中对Null值的

大家好,又见面了,我是你们的朋友全栈君。

平时经常会遇到这两种写法:IS NOT NULL与!=NULL。也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合。实际上,是由于对二者使用区别理解不透彻。

默认情况下,推荐使用 IS NOT NULL去做条件判断,因为SQL默认情况下对WHERE XX!= Null的判断会永远返回0行,却不会提示语法错误。

这是为什么呢?

SQL Server文档中对Null值的比较运算定义了两种规则,如在SQL Server 2000中:

规则一是是ANSISQL(SQL-92)规定的Null值的比较取值结果都为False,既Null=Null取值也是False。另一种不准循ANSISQL标准,即Null=Null为True。:

例如数据表test结构:

复制代码代码如下:

ROWNUM     DATA

——————-

1     ‘Liu Yang’

2     Null

3     ‘12345’



按照ANSI SQL标准,下面的两个查询都不返回任何行:

查询一: SELECT * FROM test WHERE data=NULL
查询二: SELECT * FROM test WHERE data<>NULL

而按照非ANSI SQL标准,查询1将返回第二行,查询2返回1、3行。

这是因为在SQL中,NULL是一种特有的数据类型,其等价于没有任何值、是未知数。NULL与0、空字符串、空格都不同。
ANSI SQL标准中取得Null值的行需要用下面的查询:

复制代码代码如下:

SELECT * FROM test WHERE data IS NULL



由此可见非ANSI SQL标准中data=NULL等同于data IS NULL,data<>NULL等同于data IS NOT NULL。

所以我们要牢记:默认情况下做比较条件时使用关键字“is null”和“is not null”。

如果你一定要使用!= null来进行条件判断,需要加上这个命令语句:SET ANSI_NULLS OFF,这时数据库进入ANSI SQL非标准模式,你会发现IS NOT NULL 和 != null 是等效的了。

这里使用的是模式切换命令SET ANSI_NULLS[ON/OFF]。ON值采用ANSI SQL严格标准,OFF值采用非标准兼容模式。另外SET ANSI_DEFAULTS [ON/OFF]命令也可以实现标准的切换,只是这个命令控制的是一组符合SQL-92标准的设置,其中就包括Null值的标准。

默认情况下,数据库管理程序(DB-Library)是SET ANSI_NULLS为OFF的。但是我们的大多数应用程序,都是通过ODBC或者OLEDB来访问数据库的,作为一种开放兼容的数据库访问程序,或许是兼容性的考虑,SETANSI_NULLS值设置为ON。这样一来带来的一些问题是需要注意的。像存储过程或者自定义函数这样的应用程序都是基于DB-Library的,默认情况下,SETANSI_NULLS为OFF,并且在这样的程序中,不能使用SETANSI_NULLS在一个环境中修改规则,只能修改数据库配置参数。

例如下面这种情况:你的应用程序使用ADODB来访问数据库,采用OleDb或者ODBC数据提供程序。对于查询一: SELECT * FROM test WHERE data=NULL
我们可以直接发送命令取得查询结果集,也可把它放到存储过程当中。但二者查询结果不同。若直接使用查询命令,不返回任何行;而如果访问存储过程,返回第2行的数据。

最后,我们再次声明:数据库默认情况下,做SQL条件查询比较时使用关键字“is null”和“is not null”。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133155.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月9日 下午5:46
下一篇 2022年6月9日 下午5:46


相关推荐

  • Claude Code技能包管理 Agent Skills Hub实操指南

    Claude Code技能包管理 Agent Skills Hub实操指南

    2026年3月12日
    5
  • 【C】Unity、C面试题整理

    【C】Unity、C面试题整理1 C 中类是否支持多继承 请说明原因 答 不支持 需要用接口来实现多继承 2 我们都知道一个类可以有多个构造函数 并且 C 会在我们创建类的时候默认的提供一个无参的构造函数 当我实现了另外一个有参数的构造函数的时候 我还能调用无参数的构造函数吗 请说明原因 答 不能 因为一旦你实现了一个构造函数 C 就不会再提供默认的构造函数了 所以需要自己手动写入一个无参数的构造函数

    2026年3月27日
    2
  • wifi reaver

    wifi reaverPIN码的格式很简单,八位十进制数,最后一位(第8位)为校验位(可根据前7位算出),验证时先检测前4位,如果一致则反馈一个信息,所以只需1万次就可完全扫描一遍前4位,前4位确定下来的话,只需再试1000次(接下来的3位),校验位可通过前7为算出,就可暴力验证出pin码。所以即时你不知道校验位怎么计算,那你最多尝试10000+1000+10次=11010次就可以获得PIN,从而获得wifi…

    2022年6月4日
    47
  • Python中可迭代对象是什么?

    Python中可迭代对象是什么?Python 中可迭代对象 Iterable 并不是指某种具体的数据类型 它是指存储了元素的一个容器对象 且容器中的元素可以通过 iter 方法或 getitem 方法访问 iter 方法的作用是让对象可以用 for in 循环遍历 getitem 方法是让对象可以通过 实例名 index 的方式访问实例中的元素 老猿认为这两个方法的目的是 Python 实现一个通用

    2026年3月18日
    2
  • 火山引擎发布豆包大模型1.8

    火山引擎发布豆包大模型1.8

    2026年3月12日
    2
  • JS数组转字符串

    JS数组转字符串本篇文章将介绍 JS 数组转字符串的三种方法 文章目录一 toString 方法二 toLocalStrin 方法三 join 方法 JavaScript 允许数组与字符串之间相互转换 因此提供了三种方法用来进行转换 以下开始分别介绍三种方法 一 toString 方法 1 功能 可以把每个元素转换为字符串 然后以逗号连接输出并显示 2 使用方法 vararr 0 1 2 3 定义一个数组 varstr arr toString 把 arr 数组利用 t

    2026年3月20日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号