我们常在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是可以相等的,那么将输出4条记录。实际只输出2条记录

SELECT  *FROM Test_NULL tn LEFT JOIN Test_NULL g  ON tn.num = g.numWHERE tn.lname = g.lname------------------------------------------1  Tom Jane  1  Tom Jane2  Dave    2  Dave  --查询lname为''的记录,即验证NULL不等于''SELECT  *FROM Test_NULL tnWHERE tn.lname = ''------------------------------------------2  Dave  

由于NULL是未知的,因此在SQL Server默认情况下我们不能使用=或<>去判断或查询一条NULL的记录(见上述),正确的方式是:使用IS NULL或IS NOT NULL去查询或过滤一条含有NULL的记录。

另外有函数ISNULL(),可判断并转换NULL为其他值。

--通过IS NULL查询含有NULL的记录SELECT  *FROM Test_NULL tnWHERE tn.lname IS NULL------------------------------------------3  Aaron  NULL4  Betty  NULL--NULL不等于任何值,甚至NULL不等于NULL--默认不能使用<>或=匹配NULLSELECT  *FROM Test_NULL tnWHERE tn.lname <> NULL OR tn.lname = NULL------------------------------------------

换言之,SQL Server默认是开启ANSI_NULLS选项的。

--设置ANSI_NULLS为OFF,并使用=NULL查询记录SET ANSI_NULLS OFFSELECT  *FROM Test_NULL tnWHERE tn.lname = NULL------------------------------------------3  Aaron  NULL4  Betty  NULL
--插入1条含有NULL的新记录INSERT INTO Test_NULL (num,fname,lname) VALUES(5, 'Serena', NULL)--更新某条记录的字段值为NULLUPDATE Test_NULL SET fname = NULLWHERE num = 2

通常的认识是:NULL在可变长类型(如nvarchar(50),varchar(8))中是不占用空间的,在固定长度的类型(如int)中会占用存储空间。

实际上,上述的认识不够严谨。真实情况是,NULL在可变长与固定长度的类型中均会占用空间

在SQL Server非Sparse Columns中,存储NULL的值需1个bit的NULL bitmap mask。

更多相关文章

  1. Linux系统查看磁盘可用空间的5个命令
  2. Android屏幕分辨率正确获取及PX,DPI,DP,SP等的对应关系
  3. Android(安卓)获取存储卡路径和空间使用情况
  4. Android中设置控件可见与不可见详…
  5. Android的layout_weight属性释疑
  6. android 获取uri的正确文件路径的办法
  7. Android:Layout_weight属性解析
  8. android单选框选择正确的答案
  9. android获取设备空闲空间

随机推荐

  1. Android6.0 MTK 需求文档(五)
  2. Android 自带TTS 使用
  3. android判断APP是否已经安装
  4. android下载
  5. Android(安卓)快速开发框架——————
  6. Android通过WebView调用 JS 代码
  7. android 删除文件,打开指定的文件类型
  8. Android的线程和线程池--《Android开发艺
  9. Shape Drawable
  10. Android中.9.png详解(很详细)