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。
以上就是本文的全部内容,希望对大家的学习有所帮助。
- dedecms滚动代码(dedecms使用sql语句调用文章静态链接地址的方法)
- qgis 如何平滑折线(Sqlview动态发布地图图层的方法)
- mysql常见的存储引擎(如何选择MySQL的存储引擎?)
- mysql数据恢复时间点(MySQL 基于时间点的快速恢复方案)
- sqlserver拒绝访问怎么办(SQL server服务显示远程过程调用失败的解决方法)
- mysql主从复制时突然来了一批数据(MySQL主从复制断开的常用修复方法)
- mysql默认的事务隔离级别是哪一种(MySql学习笔记之事务隔离级别详解)
- sqlserver存储过程使用变量(浅析SQL Server的嵌套存储过程中使用同名的临时表怪像)
- SqlServer 表单查询问题及解决方法(SqlServer 表单查询问题及解决方法)
- sqlserver存储删除过程(Sql中存储过程的定义、修改和删除操作)
- sqlserver常用数据结构图(Sql Server数据库常用Transact-SQL脚本推荐)
- sqlserver表导入数据(在SQLserver数据库之间进行传表和传数据的图文教程)
- sqlserver 添加分区(SQL Server 数据库分区分表水平分表详细步骤)
- 搭建php和mysql的运行环境(Windows环境开发PHP完整配置教程Apache+Mysql+PHP)
- sql 基本函数(SQL开窗函数的具体实现详解)
- mysql触发器语法规则(MySQL 触发器的使用及需要注意的地方)
- 三分71 生死战爆发 篮网旧将丁威迪今天成奇兵,助队赢球(三分71生死战爆发)
- 《红 雄安》系列广播剧第一集 水上奇兵雁翎队(雄安系列广播剧第一集)
- 小说 小伙穿越成刘备,用现代知识指挥作战,众谋士都看呆了(小伙穿越成刘备)
- 解析葡萄牙6-1瑞士 进攻多点开花,贡萨洛-拉莫斯一战成名(解析葡萄牙6-1瑞士)
- 这支 奇兵队 腕大 有范儿还各怀绝技,毒贩杀人犯见了都要仓皇而逃(这支奇兵队腕大)
- 雄藩崛起 奇兵队与幕末长州藩军事改革(雄藩崛起奇兵队与幕末长州藩军事改革)
热门推荐
- ASP.NET抓取网页内容
- mysql建立索引的主要目的(浅谈Mysql哪些字段适合建立索引)
- div左右布局自适应(如何让一个div居于页面正中间实现方法)
- sqlserver完全删除教程(sql server编写archive通用模板脚本实现自动分批删除数据)
- 小程序scroll-view自适应高度(小程序瀑布流解决左右两边高度差距过大的问题)
- iis服务器的配置(win7下配置使用IIS搭建自己的WEB服务器)
- mysql数据库简单操作(一篇文章教会你进行MySQL数据库和数据表的基本操作)
- 查看mysql索引缓存(MySQL查询缓存的小知识)
- iis服务器安装错误(IIS7.0配置过程中出现HTTP 错误 403.14的解决方法)
- navicat中如何使用sql语句(Navicat Premium操作MySQL数据库执行sql语句)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9