加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL中NULL是何意思 怎样利用

发布时间:2023-06-17 13:08:38 所属栏目:MsSql教程 来源:
导读: 我们在使用SQL Server中或维护时,常会见到NULL,很多新手对于“null是什么?”不是很了解,对此下面就给大家介绍下关于null的通俗解释和使用。 下面是MSDN给出的一段简短描述(见“Null Valu

    我们在使用SQL Server中或维护时,常会见到NULL,很多新手对于“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。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章