度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 979|回复: 3
打印 上一主题 下一主题

[分享] SQL Server中NULL的正确使用与空间占用介绍

[复制链接]

348

主题

3572

帖子

9326

积分

论坛元老

Rank: 8Rank: 8

积分
9326
跳转到指定楼层
楼主
发表于 2020-4-12 20:04:01 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们常在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值的记录,并进行相关验证操作:
  1. -创建一张允许NULL值的表
  2. CREATE TABLE Test_NULL (
  3.   num INT NOT NULL PRIMARY KEY
  4.   ,fname NVARCHAR(50) NULL
  5.   ,lname NVARCHAR(50) NULL
  6. )

  7. --对表插入4条数据:最后2条记录含有NULL值
  8. INSERT INTO Test_NULL (num,fname,lname) VALUES(1, 'Tom','Jane')
  9. INSERT INTO Test_NULL (num,fname,lname) VALUES(2, 'Dave','')
  10. INSERT INTO Test_NULL (num,fname) VALUES(3, 'Aaron')
  11. INSERT INTO Test_NULL (num,fname) VALUES(4, 'Betty')
复制代码
为了验证NULL值是未知的,我们通过如下SQL查询表Test_NULL的记录,对lname字段进行=操作:
--若两个NULL是可以相等的,那么将输出4条记录。实际只输出2条记录
  1. SELECT
  2.   *
  3. FROM Test_NULL tn
  4. LEFT JOIN Test_NULL g
  5.   ON tn.num = g.num
  6. WHERE tn.lname = g.lname
  7. ------------------------------------------
  8. 1  Tom Jane  1  Tom Jane
  9. 2  Dave    2  Dave  

  10. --查询lname为''的记录,即验证NULL不等于''
  11. SELECT
  12.   *
  13. FROM Test_NULL tn
  14. WHERE tn.lname = ''
  15. ------------------------------------------
  16. 2  Dave  
复制代码
正确查询/使用SQL Server中的NULL
由于NULL是未知的,因此在SQL Server默认情况下我们不能使用=或<>去判断或查询一条NULL的记录(见上述),正确的方式是:使用IS NULL或IS NOT NULL去查询或过滤一条含有NULL的记录。
另外有函数ISNULL(),可判断并转换NULL为其他值。
  1. --通过IS NULL查询含有NULL的记录
  2. SELECT
  3.   *
  4. FROM Test_NULL tn
  5. WHERE tn.lname IS NULL
  6. ------------------------------------------
  7. 3  Aaron  NULL
  8. 4  Betty  NULL

  9. --NULL不等于任何值,甚至NULL不等于NULL
  10. --默认不能使用<>或=匹配NULL
  11. SELECT
  12.   *
  13. FROM Test_NULL tn
  14. WHERE tn.lname <> NULL OR tn.lname = NULL
  15. ------------------------------------------
复制代码

但需注意:SQL Server仅是在默认情况下不能使用=或<>,当设置ANSI_NULLS为OFF后,即可使用=或<>查询NULL值
换言之,SQL Server默认是开启ANSI_NULLS选项的。
  1. --设置ANSI_NULLS为OFF,并使用=NULL查询记录
  2. SET ANSI_NULLS OFF
  3. SELECT
  4.   *
  5. FROM Test_NULL tn
  6. WHERE tn.lname = NULL
  7. ------------------------------------------
  8. 3  Aaron  NULL
  9. 4  Betty  NULL
复制代码
  1. --插入1条含
复制代码
NULL的空间占用
通常的认识是:NULL在可变长类型(如nvarchar(50),varchar(8))中是不占用空间的,在固定长度的类型(如int)中会占用存储空间。
实际上,上述的认识不够严谨。真实情况是,NULL在可变长与固定长度的类型中均会占用空间
在SQL Server非Sparse Columns中,存储NULL的值需1个bit的NULL bitmap mask。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复

使用道具 举报

348

主题

3572

帖子

9326

积分

论坛元老

Rank: 8Rank: 8

积分
9326
地板
 楼主| 发表于 2020-4-16 17:18:54 | 只看该作者
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
板凳
发表于 2020-4-13 13:52:11 | 只看该作者
赞一个
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9326

积分

论坛元老

Rank: 8Rank: 8

积分
9326
沙发
 楼主| 发表于 2020-4-12 20:04:25 | 只看该作者
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-11-24 05:02 , Processed in 0.131116 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表