你真的理解T-sql中的NULL吗?

时间:2023-01-02 09:31:45

NULL不表示什么?
NULL不表示空字符串,不表示0。

NULL表示什么?
NULL表示不知道是什么,就是说NULL的原意是不知道是什么,表示可能什么都是。

NULL与?做比较

PRINT (Case When NULL ='Value' Then 'true' else 'false' end)
PRINT (Case When NULL!='Value' Then 'true' else 'false' end)
PRINT (Case When NULL!=NULL Then 'true' else 'false' end)
PRINT (Case When NULL=NULL Then 'true' else 'false' end)

 

大家猜一下上面的4行表达式会返回什么?,答案在下面

你真的理解T-sql中的NULL吗?
false
false
false
false


为什么会有这样的结果呢?
答案在MSDN上:
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值做比较呢,答案是用ISNULL函数,T-sql中ISNULL函数有两个参数,第一个参数是要检查是否为NULL的表达式,第二个参数是如果要检查表达式为NULL时函数的返回值。

NULL与其他数值做运算

PRINT NULL
PRINT 1 + NULL;
PRINT 'yukaizhao' + NULL;
DECLARE @d datetime;
SET @d = GETDATE();
PRINT @d + NULL;

 

大家猜一下上面的语句会PRINT出来什么?
答案是什么都没有,所有运算都和PRINT NULL是相同结果,结果还是NULL

NULL值与索引
如果一个列中有NULL值,那么不可以在这个列上建唯一索引,可以建立非唯一索引;但是如果一个字段有很多行有NULL值,那么在这个字段上建索引效果不佳。所以建议不在在一个频繁出现NULL值的字段上建索引(有待证实)

NULL与排序
NULL参与排序时总是作为最小值存在,即ORDER BY COL ASC时COL为NULL的行在最前面,反之在最后面。

附注:t-sql中三个关于NULL的函数:
ISNULL(check_expression, replacement_value)

check_expression 与 replacement_value 数据类型必须一致 
如果 check_expression 为 NULL,则返回 replacement_value 
如果 check_expression 不为 NULL,则返回 check_expression
 

NULLIF 用于检查两个表达式,语法:
NULLIF(expression, expression)

如果两个 expression 相等,则返回 NULL,该 NULL 为第一个 expression 的数据类型 
如果两个 expression 不相等,则返回第一个 expression

COALESCE()函数可以接受一系列的值,如果列表中所有项都为空(null),那么只使用一个值。然后,它将返回第一个非空值。这一技巧描述了创造性使用SQL Server 中COALESCE()函数的两种方法。

具体用法请参考:http://www.builder.com.cn/2007/0518/401640.shtml