如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新纪录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。
NULL 用作未知的或不适用的值的占位符。
下面具体分析一下NULL
<一>
注释:无法比较 NULL 和 0;它们是不等价的
那么我们如何测试 NULL 值呢?有很多人是这样人为地
例1:
无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。
我们必须使用 IS NULL 和 IS NOT NULL 操作符。
如:
SELECT * FROM A WHERE id IS NULL
和
SELECT * FROM A WHERE id IS NOT NULL
而非
SELECT * FROM A WHERE id = NULL
和
SELECT * FROM A WHERE id <> NULL
其实上上面的说法是不对的
引用:
SQL-92 标准要求在对空值进行等于 (=) 或不等于 (<>) 比较时取值为 FALSE。当 SET ANSI_NULLS 为 ON 时,即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中包含非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍会返回零行。
当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中包含空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中包含非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有不为 XYZ_value 也不为 NULL 的行。
例:
CREATE TABLE t1 (a INT NULL)
INSERT INTO t1 values (NULL)
INSERT INTO t1 values (0)
INSERT INTO t1 values (1)
GO
SET ANSI_NULLS ON
DECLARE @varname int
SELECT @varname = NULL
SELECT * FROM t1 WHERE a = @varname
/*a
-----------
(0 行受影响)
*/
SELECT * FROM t1 WHERE a <> @varname
/*
a
-----------
(0 行受影响)
*/
SELECT * FROM t1 WHERE a IS NULL
/*a
-----------
NULL
(1 行受影响)
*/
SET ANSI_NULLS OFF
DECLARE @varname int
SELECT @varname = NULL
SELECT * FROM t1 WHERE a = @varname
/*
a
-----------
NULL
(1 行受影响)
*/
SELECT * FROM t1 WHERE a <> @varname
/*a
-----------
0
1
(2 行受影响)
*/
SELECT * FROM t1 WHERE a IS NULL
/*
a
-----------
NULL
(1 行受影响)
*/
<二>
警告: 聚合或其他 SET 操作消除了空值。
我刚遇到这个错误的时候也很迷茫,后来在水哥的帮助下得以明白这个警告的意思,使我更深入的了解了NULL
下面是水哥给的例子,很精辟
暂时就总结这两点了,以后有发现在补上
最后宣传一下水哥的博客水哥
里面写了好多技术性东西,很好很强大
declare @t table([No] int,ID int )
insert @t select 10,1
insert @t select 11,1
insert @t select null,2
insert @t select 12,2
select sum([no]),avg([no]) from @t group by id
/*----------- -----------
21 10
12 12
警告: 聚合或其他 SET 操作消除了空值。
(2 行受影响)
*/
SET ANSI_NULLS { ON | OFF }