sqlserver如何查找值为null的数据(SQL Server中NULL的正确使用与空间占用)
sqlserver如何查找值为null的数据
SQL Server中NULL的正确使用与空间占用我们常在SQL Server的使用或维护中遇上NULL,那么什么是NULL?如下是MSDN给出的一段简短描述(见“Null Values”):
- A value of NULL indicates that the value is unknown. A value of NULL is different from an empty or zero value. No two null values are equal. Comparisons between two null values, or between a NULL and any other value, return unknown because the value of each NULL is unknown.
通俗的讲,NULL就是一个值,而且这个值是未知的(unknown);NULL不能等价任何值,甚至都不等价它自己,即NULL不等于NULL。
为了清晰的理解上述的内容,我们创建一个测试表Test_NULL,然后对表插入2条含有NULL值的记录,并进行相关验证操作:
--创建一张允许NULL值的表 CREATE TABLE Test_NULL ( num INT NOT NULL PRIMARY KEY ,fname NVARCHAR(50) NULL ,lname NVARCHAR(50) NULL ) --对表插入4条数据:最后2条记录含有NULL值 INSERT INTO Test_NULL (num,fname,lname) VALUES(1, 'Tom','Jane') INSERT INTO Test_NULL (num,fname,lname) VALUES(2, 'Dave','') INSERT INTO Test_NULL (num,fname) VALUES(3, 'Aaron') INSERT INTO Test_NULL (num,fname) VALUES(4, 'Betty')
为了验证NULL值是未知的,我们通过如下SQL查询表Test_NULL的记录,对lname字段进行=操作:
--若两个NULL是可以相等的,那么将输出4条记录。实际只输出2条记录
SELECT * FROM Test_NULL tn LEFT JOIN Test_NULL g ON tn.num = g.num WHERE tn.lname = g.lname ------------------------------------------ 1 Tom Jane 1 Tom Jane 2 Dave 2 Dave --查询lname为''的记录,即验证NULL不等于'' SELECT * FROM Test_NULL tn WHERE tn.lname = '' ------------------------------------------ 2 Dave
正确查询/使用SQL Server中的NULL
由于NULL是未知的,因此在SQL Server默认情况下我们不能使用=或<>去判断或查询一条NULL的记录(见上述),正确的方式是:使用IS NULL或IS NOT NULL去查询或过滤一条含有NULL的记录。
另外有函数ISNULL(),可判断并转换NULL为其他值。
--通过IS NULL查询含有NULL的记录 SELECT * FROM Test_NULL tn WHERE tn.lname IS NULL ------------------------------------------ 3 Aaron NULL 4 Betty NULL --NULL不等于任何值,甚至NULL不等于NULL --默认不能使用<>或=匹配NULL SELECT * FROM Test_NULL tn WHERE tn.lname <> NULL OR tn.lname = NULL ------------------------------------------
但需注意:SQL Server仅是在默认情况下不能使用=或<>,当设置ANSI_NULLS为OFF后,即可使用=或<>查询NULL值
换言之,SQL Server默认是开启ANSI_NULLS选项的。
--设置ANSI_NULLS为OFF,并使用=NULL查询记录 SET ANSI_NULLS OFF SELECT * FROM Test_NULL tn WHERE tn.lname = NULL ------------------------------------------ 3 Aaron NULL 4 Betty NULL
插入或更新NULL值:
--插入1条含有NULL的新记录 INSERT INTO Test_NULL (num,fname,lname) VALUES(5, 'Serena', NULL) --更新某条记录的字段值为NULL UPDATE Test_NULL SET fname = NULL WHERE num = 2
NULL的空间占用
通常的认识是:NULL在可变长类型(如nvarchar(50),varchar(8))中是不占用空间的,在固定长度的类型(如int)中会占用存储空间。
实际上,上述的认识不够严谨。真实情况是,NULL在可变长与固定长度的类型中均会占用空间
在SQL Server非Sparse Columns中,存储NULL的值需1个bit的NULL bitmap mask。
以上就是本文的全部内容,希望对大家的学习有所帮助。
- 小米机器狗用什么二次开发(小米正式开源 SQL 智能优化与改写工具 SOAR)
- mysql实现mvc(mysql的MVCC多版本并发控制的实现)
- sqlserver自增字段(SQL Server中identity自增的用法详解)
- sql server网络配置
- mysql对null值如何理解(MySQL为Null会导致5个问题个个致命)
- sqlserver统计表大小(SqlServer 垂直分表减少程序改动)
- sqlserver怎么加check约束(浅析SQL Server的分页方式 ISNULL与COALESCE性能比较)
- SQL中Truncate的用法
- dedecms怎么设置栏目(DEDECMS实现在标签中嵌套调用SQL的方法)
- sql根据条件查出两条一样的数据(SQL中遇到多条相同内容只取一条的最简单实现方法)
- sqlserver如何生成xml文件(实现SQL Server 原生数据从XML生成JSON数据的实例代码)
- 查询按照部门分组的mysql语句(Mysql根据某层部门ID查询所有下级多层子部门的示例)
- SQL如何操作Xml字段
- mysql如何给一个表批量添加字段(mysql从一张表查询批量数据并插入到另一表中的完整实例)
- sqlserver2000升级教程(MSSQL 2000 使用帮助sql server简明教程)
- SQL中FOR XML PATH
- 你或许不知道你隐藏的支配欲望(你或许不知道你隐藏的支配欲望)
- 把宽体丰田86卖了,换成7.5代高尔夫GTI玩起姿态与性能并存的改装(把宽体丰田86卖了)
- 大众推出了第五代高尔夫GT(大众推出了第五代高尔夫GT)
- 换代在即,现在是抄底 7.5代 高尔夫的最佳时机吗(换代在即现在是抄底)
- 2020年大众7.5代高尔夫R终结特别版 最后的呐喊(2020年大众7.5代高尔夫R终结特别版)
- 七年前的这部剧有毒,全剧只有女主红到发紫,男主至今无人认识(七年前的这部剧有毒)
热门推荐
- jquery五子棋javascript(原生JavaScript实现简单五子棋游戏)
- 上不了网怎么知道错误代码(访问网站出现508状态码的解决方法)
- js的三种使用方法(JS带你深入领略Proxy的世界)
- wordpress如何在文章中自定义html(wordpress添加Html5的表单验证required方法小结)
- dedecms使用手册(dedecms 软件下载模块中添加下载方式为迅雷下载联盟代码)
- laravel5开发规范(laravel5.1框架基础之路由详解)
- filezilla连接远程服务器配置(FileZilla 425 无法连接FTP的解决方法阿里云服务器)
- 虚拟机安装centos8网络设置(VMware安装CentOS虚拟机与配置网络的图文教程)
- python比go语言简单(Python和Go语言的区别总结)
- 写出好代码的几个建议
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9