平时经常会遇到这两种写法: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://www.cnblogs.com/hushuai1314/p/6240057.html

SQL语句中=null和is null相关推荐

  1. oracle sum函数返回空,关于SQL语句中SUM函数返回NULL的解决办法

    SUM 是SQL语句中的标准求和函数,如果没有符合条件的记录,那么SUM函数会返回NULL. 但多数情况下,我们希望如果没有符合条件记录的情况下,我们希望它返回0,而不是NULL,那么我们可以使用例如 ...

  2. sql 语句中的 NULL值

    今天写了这样的代码 DECLARE @atr NVARCHAR(20) SET @atr = NULL IF(@atr = NULL) BEGIN   PRINT 1 END     原本是想打印出1 ...

  3. oracle sql语句中有关null使用的一点理解

    为什么80%的码农都做不了架构师?>>>    最近在写pl/sql package时,发现了原来使用null时的一些问题, 下面是我的理解,可能有不对的地方,欢迎大家指正. SQL ...

  4. mysql 语句中 sum函数求和 null 变 0

    在SQL语句中使用集合函数count(),返回结果肯定为非负整数,这也是用来判断数据有无的一个很有效的方法: 然后在用sum()进行集合相加的时候,如果sum()的对象没有记录,那么不会返回0,而返回 ...

  5. sql语句中left join和inner join中的on与where的区别分析

    原文:sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用 ...

  6. Sql 语句中 IN 和 EXISTS

    原文链接:  (2条消息)Sql 语句中 IN 和 EXISTS 的区别及应用 - jcpp9527的博客 - CSDN博客 https://blog.csdn.net/wqc19920906/art ...

  7. SQL点滴31—SQL语句中@@IDENTITY和@@ROWCOUNT区别

    原文:SQL点滴31-SQL语句中@@IDENTITY和@@ROWCOUNT区别 SQL语句中@@IDENTITY和@@ROWCOUNT区别 在一条 INSERT.SELECT INTO 或大容量复制 ...

  8. oracle 哦【的【,清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

    清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦 直入主题: 我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象? 使用内连接,查询数据 问 ...

  9. Mybatis 源码探究 (4) 将sql 语句中的#{id} 替换成 ‘?

    Mybatis 源码探究 (4) 将sql 语句中的#{id} 替换成 '? 出于好奇,然后就有了这篇文章啦. 源码给我的感觉,是一座大山的感觉.曲曲折折的路很多,点进去就有可能出不来. 不过慢慢看下 ...

  10. SQL语句中的select高级用法

    #转载请联系 为了更好的了解下面的知识点,我们先创建两张表并插入数据. # 学生表 +----+-----------+------+--------+--------+--------+------ ...

最新文章

  1. Google Brain大牛Jeff dean视频
  2. scrum敏捷开发工具leangoo如何添加成员
  3. 什么是计算机的网络体系结构,什么是网络体系结构 网络体系结构介绍【详解】...
  4. 16 代码分割之错误边界与Suspense和命名导出
  5. 放寒假的硕博研究生将经历什么?
  6. 计算机科学与技术大学生职业规划,计算机科学与技术大学生职业生涯规划ppt
  7. 修改华为服务器管理口地址,修改华为服务器管理口地址
  8. php jquery ajax实例,jQuery的$.ajax示例
  9. 开发iOS百度地图大头针可以重复点击
  10. SAP Cloud for Customer里Sales Order和Sales Quote的建模方式 1
  11. POJ 3267 The Cow Lexicon(动态规划)
  12. Dlink ?一款交互式FlinkSQL开发平台
  13. python 遗传算法书籍推荐_转 强烈推荐遗传算法入门例子
  14. Windows 10 下使用 telnet 客户端/服务端工具进行连接
  15. Inspinia的version 2.4模板使用的谷歌字体加载很慢问题解决
  16. C#注入DLL-C#注入器
  17. 伊诺伊香槟分校计算机世界排名,伊利诺伊大学香槟分校世界排名及专业排名汇总(QS世界大学排名版)...
  18. java实验总结与心得_java实验心得体会范例精选
  19. position:sticky新特性
  20. (一)libvirt库简介

热门文章

  1. springcloud记录篇6-分布式配置中心
  2. 利用并查集判断一个无向图是否成树
  3. 利用Azure backup备份和恢复Azure虚拟机(1)
  4. Ubuntu配置安装NFS服务器
  5. [转载]windows2003上IIS+PyISAPIe1.1..0部署成功
  6. Python学习笔记之函数(一)
  7. python使用sqlite
  8. Spring获取前台参数的几种方式
  9. python代码评测结果tle_TLE计算列表中指定范围内的元素数 - python
  10. Win7 无法进行Windows自动更新