• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    SQL Server中NULL的正确使用与空间占用

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

    通俗的讲,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。

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

    您可能感兴趣的文章:
    • SQLserver查询数据类型为ntext是空或NULL值的方法
    • sqlserver对字段出现NULL值的处理
    • sqlserver isnull在数据库查询中的应用
    • SQL Server、Oracle和MySQL判断NULL的方法
    • 深入SQLServer中ISNULL与NULLIF的使用详解
    • 浅谈SQLServer的ISNULL函数与Mysql的IFNULL函数用法详解
    • sqlserver 不能将值NULL插入列id(列不允许有空值解决)
    • SQLSERVER ISNULL 函数与判断值是否为空的sql语句
    • 在SQL Server中使用ISNULL执行空值判断查询
    上一篇:SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同
    下一篇:SQL SERVER备份数据库存储过程的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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