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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sklearn安装教程_sklearn库的使用

    sklearn安装教程_sklearn库的使用Sklearn(全称Scikit-Learn)是基于Python语言的机器学习工具,是机器学习中的常用第三方模块。它建立在NumPy,SciPy和Matplotlib之上。因此,在安装sklearn之前,需要先安装其三个依赖库numpy+scipy+matplotlib,具体安装步骤如下:1.进入官网下载相应的模块安装地址如下https://www.lfd.uci.edu/~gohlke/pythonlibs网站中包含了python中所需的子库。进去之后查找比较麻烦,可以在网址后

    2022年10月18日
    5
  • cstring头文件都有什么函数_cstdlib是什么头文件

    cstring头文件都有什么函数_cstdlib是什么头文件cstring中包含许多字符数组的函数:strlen()函数:strlen函数可以得到字符数组中第一个\0前的字符的个数strcmp()函数:strcmp函数返回两个字符串大小的比较结果,比较原则是按字典序strcpy()函数:strcpy函数可以把一个字符串复制给另一个字符串strcat()函数:strcat()可以把一个字符串接到另一个字符串后面sscanf与sprintf用法:假设定义了一个字符数组str[100],如下:sscanf(str,”%d”,

    2025年11月8日
    3
  • Kali更新源签名无效问题[通俗易懂]

    Kali更新源签名无效问题[通俗易懂]一:Kali更新源签名无效问题1.1:问题展示·更换中科大源报错root@kali:~#apt-getupdate获取:1https://repo.huaweicloud.com/kalikali-rollingInRelease[30.5kB]错误:1https://repo.huaweicloud.com/kalikali-rollingInRelease下列签名无效:EXPKEYSIGED444FF07D8D0BF6KaliLinuxReposito

    2022年5月28日
    121
  • [Drupal学习一]Drupal安装和基本配置[通俗易懂]

    [Drupal学习一]Drupal安装和基本配置[通俗易懂]1.从官方网站上下载drupal-6.16 http://drupal.org/drupal-6.162.将下载的压缩包文件直接解压,放到apache的站点目录中。此时drupal的路径为WEB-SERVER/drupal3.访问站点http://localhost:8888/drupal/将进入drupal的安装页面。此时会提醒我们要拷贝重命名.sites/default/de…

    2022年7月20日
    17
  • Pytest(10)assert断言[通俗易懂]

    Pytest(10)assert断言[通俗易懂]前言断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了。什么是断言呢?简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试failed

    2022年8月6日
    5
  • cnetos6.4搭建tomcat7

    cnetos6.4搭建tomcat7

    2021年8月30日
    54

发表回复

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

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