SET ANSI_NULLS{ON|OFF}:用来指定对空值使用等于(=)和不等于(<>)比较运算符时,这些运算符应遵从什么行为.具体是什么样的行为呢?SQL-92要求如下:

SQL-92 标准要求对空值的等于 (=) 或不等于 (<>) 比较取值为 FALSE,是默认值。

当 SET ANSI_NULLS 为 ON 时,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍返回零行。

当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中含有空值的行;使用 WHERE column_name <> NULL 的 SELECT 语句返回列中含有非空值的行;使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有非 XYZ 值和非 NULL的行。

SQL Server联机丛书关于ANSI_NULLS里有这样一个代码示例,给出了直观的效果,我添加了输出提示,如下:

-- Create table t1 and insert values.

CREATE TABLE t1 (a INT NULL)

INSERT INTO t1 values (NULL)

INSERT INTO t1 values (0)

INSERT INTO t1 values (1)

GO

-- Print message and perform SELECT statements.

PRINT 'Testing default setting'

DECLARE @varname int

SELECT @varname = NULL

SELECT *

FROM t1

WHERE a = @varname     --结果为空

SELECT *

FROM t1

WHERE a <> @varname    --结果为空

SELECT *

FROM t1

WHERE a IS NULL        --结果为NULL

GO

-- SET ANSI_NULLS to ON and test.

PRINT 'Testing ANSI_NULLS ON'

SET ANSI_NULLS ON

GO

DECLARE @varname int

SELECT @varname = NULL

SELECT *

FROM t1

WHERE a = @varname     --结果为空

SELECT *

FROM t1

WHERE a <> @varname    --结果为空

SELECT *

FROM t1

WHERE a IS NULL        --结果为NULL

GO

-- SET ANSI_NULLS to OFF and test.

PRINT 'Testing SET ANSI_NULLS OFF'

SET ANSI_NULLS OFF

GO

DECLARE @varname int

SELECT @varname = NULL

SELECT *

FROM t1

WHERE a = @varname     --结果为NULL

SELECT *

FROM t1

WHERE a <> @varname    --结果为0,1

SELECT *

FROM t1

WHERE a IS NULL        --结果为NULL

GO

-- Drop table t1.

DROP TABLE t1

从上面代码的运行效果来看:

①当SET ANSI_NULLS ON时, =null或 <> null的查询条件时,结果都为空;如果为 IS NULL 才能显示NULL的行。

②不对ANSI_NULLS进行设置时,其执行效果与SET ANSI_NULLS ON时的效果一致,此处与SQL-92的要求之一“SQL-92 标准要求对空值的等于 (=) 或不等于 (<>) 比较取值为 FALSE,是默认值。”冲突哦?!

又怎么理解这个问题呢?

SQL Server联机丛书里ANSI_NULLS的知识文档里有答案:“SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在连接时自动将 ANSI_NULLS 设置为 ON。该设置可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性(它们在连接到 SQL Server 之前在应用程序中设置)中进行配置。”

PS:其实,实际使用过程中,我们并没有考虑ANSI_NULLS是被设置为ON还是False,我们对空值的处理都是IS NULL 或者 IS NOT NULL

mysql ansi nulls_SQL学习笔记之ANSI_NULLS相关推荐

  1. B站《一天学会 MySQL 数据库》学习笔记

    B站<一天学会 MySQL 数据库>学习笔记 老司机带我飞 职场十字诀:思考.计划.行动.总结.反思 ​关注他 4 人赞同了该文章 登录和退出MySQL服务器 # 登录MySQL $ my ...

  2. mysql性能优化-学习笔记

    mysql性能优化-学习笔记

  3. 三、MySQL子查询学习笔记(标量子查询、列子查询、行子查询、表子查询 详解)

    三.MySQL子查询学习笔记 7:子查询 含义: 一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询:在外面的查询语句,称为主查询或外查询 分类: 一 ...

  4. mysql root密码忘记2018_MySQL数据库之2018-03-28设置及修改mysql用户密码学习笔记

    本文主要向大家介绍了MySQL数据库之2018-03-28设置及修改mysql用户密码学习笔记 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 退出mysql方法 quit或者e ...

  5. mysql的sqlyog学习笔记(查询部分)(代码用命令行显示 )

    索引 语言 查询 基础查询 select 查询列表 from 表名; 查询函数(调用函数,获取返回值) 起别名 +的作用 distinct的使用(去重) 查看表的结构 条件查询 按关系表达式筛选 按逻 ...

  6. mysql中depart_mysql 学习笔记

    1)net stop mysql net start mysql 2)c:\mysql\bin\mysqladmin flush-privileges      3)登陆mysql后,用flush p ...

  7. 如何查看mysql my.ini_MySQL学习笔记(一)

    MySQL  学习笔记 一.安装 Typical:经典安装 Custom:自定义安装 Complete: 完全安装 二.修改编码方式 [mysqld] myini:character-set-serv ...

  8. mysql over rank_SQL学习笔记 - 窗口函数OVER

    Window Function 窗口函数 Perform calculations on an already generated result set ( a window).(在已生成的结果集上执 ...

  9. MySQL快速上手[学习笔记](三)

    前言: 课程:<三大主流数据库快速上手>(点击跳转官方课程,b站有资源,可自搜) 笔记(点击跳转豆丁网) 此处是个人学习笔记,用作回顾用途 目录: 七.函数 八.视图 九.触发器 十.存储 ...

最新文章

  1. HTTP FTP 返回状态代码
  2. APP鉴赏之网易云音乐
  3. Hadoop MapReduce入门程序wordcount代码示例及打包部署运行结果演示
  4. JavaScript实现省市二级联动
  5. 获得SAP help center的url
  6. 用python绘制图形_python绘制图形
  7. 44 The shopping psychology 购物心理
  8. SharePoint 2013 中的新增功能(与开发有关)
  9. 汽车后市场的大数据引擎谁人可造
  10. git下载和安装详细
  11. Photoshop CC(2018)安装教程
  12. HTML5 之 Link 标签
  13. Ajax访问接口报错NET::ERR_CERT_REVOKED
  14. 钟平程序员逻辑英语——回归理性——中英文对切基本公式(1-1)
  15. 服务式办公室,价格影响选择
  16. java向文件写数据的3种方式
  17. 一键安装Win7正版系统 Win7镜像系统2022
  18. C++:cannot open source file问题
  19. java英语单词学习网站 Vue项目源码介绍
  20. 可视化大数据数据决策分析_通过数据可视化为您的业务做出更好的决策

热门文章

  1. 广讯通(OA)无法打开网页文件的解决办法
  2. 卖500元个人版通用权限管理系统组件源码终于引来了下50万C#.NET软件开发订单的大客户...
  3. 如何让一个程序员变成产品经理?
  4. openssl 漏洞
  5. ASSERT_VALID
  6. diskgenius恢复文件(diskgenius恢复文件收费)
  7. 【无标题】内部表和外部表的区别
  8. 内部表与外部表——头歌
  9. 以点带面,全面解决现有问题的网吧路由器解决方案(转)
  10. Invalid character found in method name. HTTP method names must be tokens