mysql ansi nulls_SQL学习笔记之ANSI_NULLS
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相关推荐
- B站《一天学会 MySQL 数据库》学习笔记
B站<一天学会 MySQL 数据库>学习笔记 老司机带我飞 职场十字诀:思考.计划.行动.总结.反思 关注他 4 人赞同了该文章 登录和退出MySQL服务器 # 登录MySQL $ my ...
- mysql性能优化-学习笔记
mysql性能优化-学习笔记
- 三、MySQL子查询学习笔记(标量子查询、列子查询、行子查询、表子查询 详解)
三.MySQL子查询学习笔记 7:子查询 含义: 一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询:在外面的查询语句,称为主查询或外查询 分类: 一 ...
- mysql root密码忘记2018_MySQL数据库之2018-03-28设置及修改mysql用户密码学习笔记
本文主要向大家介绍了MySQL数据库之2018-03-28设置及修改mysql用户密码学习笔记 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 退出mysql方法 quit或者e ...
- mysql的sqlyog学习笔记(查询部分)(代码用命令行显示 )
索引 语言 查询 基础查询 select 查询列表 from 表名; 查询函数(调用函数,获取返回值) 起别名 +的作用 distinct的使用(去重) 查看表的结构 条件查询 按关系表达式筛选 按逻 ...
- mysql中depart_mysql 学习笔记
1)net stop mysql net start mysql 2)c:\mysql\bin\mysqladmin flush-privileges 3)登陆mysql后,用flush p ...
- 如何查看mysql my.ini_MySQL学习笔记(一)
MySQL 学习笔记 一.安装 Typical:经典安装 Custom:自定义安装 Complete: 完全安装 二.修改编码方式 [mysqld] myini:character-set-serv ...
- mysql over rank_SQL学习笔记 - 窗口函数OVER
Window Function 窗口函数 Perform calculations on an already generated result set ( a window).(在已生成的结果集上执 ...
- MySQL快速上手[学习笔记](三)
前言: 课程:<三大主流数据库快速上手>(点击跳转官方课程,b站有资源,可自搜) 笔记(点击跳转豆丁网) 此处是个人学习笔记,用作回顾用途 目录: 七.函数 八.视图 九.触发器 十.存储 ...
最新文章
- HTTP FTP 返回状态代码
- APP鉴赏之网易云音乐
- Hadoop MapReduce入门程序wordcount代码示例及打包部署运行结果演示
- JavaScript实现省市二级联动
- 获得SAP help center的url
- 用python绘制图形_python绘制图形
- 44 The shopping psychology 购物心理
- SharePoint 2013 中的新增功能(与开发有关)
- 汽车后市场的大数据引擎谁人可造
- git下载和安装详细
- Photoshop CC(2018)安装教程
- HTML5 之 Link 标签
- Ajax访问接口报错NET::ERR_CERT_REVOKED
- 钟平程序员逻辑英语——回归理性——中英文对切基本公式(1-1)
- 服务式办公室,价格影响选择
- java向文件写数据的3种方式
- 一键安装Win7正版系统 Win7镜像系统2022
- C++:cannot open source file问题
- java英语单词学习网站 Vue项目源码介绍
- 可视化大数据数据决策分析_通过数据可视化为您的业务做出更好的决策
热门文章
- 广讯通(OA)无法打开网页文件的解决办法
- 卖500元个人版通用权限管理系统组件源码终于引来了下50万C#.NET软件开发订单的大客户...
- 如何让一个程序员变成产品经理?
- openssl 漏洞
- ASSERT_VALID
- diskgenius恢复文件(diskgenius恢复文件收费)
- 【无标题】内部表和外部表的区别
- 内部表与外部表——头歌
- 以点带面,全面解决现有问题的网吧路由器解决方案(转)
- Invalid character found in method name. HTTP method names must be tokens