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

 更新时间:2015年06月25日 11:43:09   投稿:junjie   我要评论
这篇文章主要介绍了SQL中IS NOT NULL与!=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”。

相关文章

  • NoSQL数据库的分布式算法详解

    NoSQL数据库的分布式算法详解

    系统的可扩展性是推动NoSQL运动发展的的主要理由,包含了分布式系统协调,故障转移,资源管理和许多其他特性。尽管NoSQL运动并没有给分布式数据处理带来根本性的技术变革,但是依然引发了铺天盖地的关于各种协议和算法的研究以及实践。
    2015-09-09
  • 数据库设计的折衷方法

    数据库设计的折衷方法

    数据库设计的折衷方法...
    2007-03-03
  • SQL服务器面临的危险和补救.读[十种方法]后感.

    SQL服务器面临的危险和补救.读[十种方法]后感.

    SQL服务器面临的危险. 危险:没有防火墙保护,暴露在公网中. 后果:SQL蠕虫感染和黑客进行拒绝服务攻击、缓存溢出、SQL盲注和其它攻击. 补救:安装一款防火墙,即使经费有限,网上也有大把的免费产品.
    2008-05-05
  • SQL注入之基于布尔的盲注详解

    SQL注入之基于布尔的盲注详解

    首先说明的盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。盲注一般分为布尔盲注和基于时间的盲注。这篇文章主要讲解的是基于布尔的盲注。下面来一起看看吧。
    2016-09-09
  • 14张图看懂什么是区块链技术

    14张图看懂什么是区块链技术

    这篇文章主要为大家分享了14张图,帮助大家看懂什么是区块链技术,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • ADO,OLEDB,ODBC,DAO,RDO的区别说明

    ADO,OLEDB,ODBC,DAO,RDO的区别说明

    ADO,OLEDB,ODBC,DAO,RDO的区别说明,因为我们用程序开发的时候经常会用到OLEDB,ODBC链接数据库等
    2012-09-09
  • ACCESS转SQLSERVER数据库的注意事项

    ACCESS转SQLSERVER数据库的注意事项

    Access承重量太低,当你考虑升级到SQL Server时,并不只是个连接字符串需要改变,需要改变的还有很多
    2007-01-01
  • 数据库语言分类DDL、DCL、DML详解

    数据库语言分类DDL、DCL、DML详解

    今天小编就为大家分享一篇关于数据库语言分类DDL、DCL、DML详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • db2数据库常用操作命令大全

    db2数据库常用操作命令大全

    这篇文章主要介绍了db2数据库常用操作命令大全,汇总了DB2的常用操作命令,分享给大家供大家参考,需要的朋友可以参考下
    2014-09-09
  • mssql注入躲避IDS的方法

    mssql注入躲避IDS的方法

    可能这个技巧早有人已经会了,就是利用openrowset发送本地命令。通常我们的用法是(包括MSDN的列子)
    2008-06-06

最新评论