SQL Server中NULL的正确使用与空间占用

我们常在sql Server的使用或维护中遇上NULL,那么什么是NULL?如下是MSDN给出的一段简短描述(见“Null Values”):

  • Nown. 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值的记录,并进行相关验证操作:

rush:sql;"> --创建一张允许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,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条记录

rush:sql;"> 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为其他值。

rush:sql;"> --通过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选项的。

rush:sql;"> --设置ANSI_NULLS为OFF,并使用=NULL查询记录 SET ANSI_NULLS OFF SELECT * FROM Test_NULL tn WHERE tn.lname = NULL ------------------------------------------ 3 Aaron NULL 4 Betty NULL

插入或更新NULL值:

rush:sql;"> --插入1条含有NULL的新记录 INSERT INTO Test_NULL (num,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。

以上就是本文的全部内容,希望对大家的学习有所帮助。

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...