NULL值
NULL 表示"没有值"。
NULL并不等同于0或者空格。
在查询过程中用两个字段进行比较时,如果出现null值,就不能再用等号进行比较。
原因是:Null 值代表的是一个缺少的值或不可知的值,所以无法判断一个不可知的值是否等于另一个。所以用等号(或者其他运算符)把任何值和null进行比较总是会返回unknown。即使对两个null值进行比较(null=null)也是会返回unknown。
如果坚持进行比较,可以尝试使用 ISNULL函数,转化后再进行比较。
ISNULL函数的语法:
用指定的替换值来替换NULL
ISNULL(check_expression,replacement_expression)
如果check_expression的表达式不为null,则返回该表达式的值,否则返回replacement_expression.
replacement_expression 的数据类型和check_expression的数据类型要一致。
例如:在查询时设置过滤条件时,
查询成绩小于70的学生
WHERE ISNULL(score,0)<70;
还比如 需要转换数据类型(ISNULL和convert结合使用)
where ISNULL(Convert(nvarchar,‘order.date’),‘unknown’)=ISNULL(Convert(nvarchar,‘sales.date’),‘unknown’);
上面有说道, Null 值代表的是一个缺少的值或不可知的值,所以无法判断一个不可知的值是否等于另一个。
所以,sql提供了连个谓词IS NULL和IS NOT NULL,来替代=NULL和<>NULL。
sql支持使用NULL来表示缺少的值,它使用的是三值谓词逻辑,意味着计算结果是True,False和Unknown。
通过一个实例来分析,在一张表里面查询region='WA’的所有客户:
select custid,region
from Sales.Customers
where region=‘WA’;
但是查询region不等于WA的所有客户:
select custid,region
from Sales.Customers
where region<>‘WA’;
返回的记录却不全(只有28行),因为等于null的那一部分记录没有返回。
想查找region是null的所有行,如果使用谓词region=null这个表达式,对所有行的计算结果都是Unknown,返回的则是一个空的结果集。
select custid,region
from Sales.Customers
where region=null;
所以想返回region列不等于WA的所有列(既包括region列有值,但不为WA的那些行,也包括region列缺少值的那些行),则需要在查询过滤条件中显示的增加一个对null值得测试。
select custid,region
from Sales.Customers
where region <>‘WA’
or region is null;
T-SQL 是把null值排在了有效值之前。要想把null值输出结果放在最后,可以对结果进行排序。
select custid,region
from Sales.Customers
where region <>‘WA’
or region is null
order by
case when region is null then 1 else 0 end,region.