1. 什么是空值
在 SQL Server 中,空值(Null)指的是不存在值的状态。空值不等于空字符串或者空格符,它是一种特殊的标记,表示缺少值或者未知值。空值可以出现在表中的一个或多个列中,并不一定只存在于一个列中。
在 SQL Server 中,空值是与 NULL
关键字相关的。如果一个表的某个列的值为 NULL
,那么这个列是没有值的。空值可以比较,但是它和其他任何值都不相等,包括空值。
下面是一些例子,演示空值的特点。
SELECT * FROM table_name WHERE column_name=NULL;
SELECT * FROM table_name WHERE column_name IS NULL;
第一行会返回一个空集合,因为在 SQL Server 中,不能使用等号来比较空值(尽管在一些其他数据库中,可以用等号来比较空值)。第二行使用 IS NULL
来比较空值,这样可以得到一个正确的结果。
2. 空值的影响
2.1 与空值相加或相连
如果一个表的某列包含空值,则在对它进行某些算术或字符串操作时,可能会出现一些意料之外的结果。例如,如果一行记录中包含了空值,那么将这一行与另一行相加,并不会得到正确的结果:
DECLARE @table TABLE (id int, value int)
INSERT INTO @table VALUES (1, 10), (2, NULL), (3, 30), (4, 40)
SELECT *, value+1 AS new_value FROM @table
结果如下:
id value new_value
--------------------
1 10 11
2 NULL NULL
3 30 31
4 40 41
在表中包含空值的一列进行相加时,返回的结果都是空值。这是因为 SQL Server 不知道应该返回什么值。
2.2 比较与空值相关的列
在 SQL Server 中,比较空值的列不会返回正确的结果。例如:
DECLARE @table TABLE (id int, value int)
INSERT INTO @table VALUES (1, 10), (2, NULL), (3, 30), (4, 40)
SELECT * FROM @table WHERE value > 20
结果:
id value
----------
3 30
4 40
虽然 value
列中包含了空值,但是其它行中的值仍然可以进行比较。如果仅考虑为空值的行,则需要使用 IS NULL
或者 IS NOT NULL
来替代比较符号。
2.3 空值的索引与排序
对包含空值的列进行索引或排序时,需要特别注意。例如:在一个表中,value
列包含了空值,那么直接对 value
进行索引(不存在其他列的索引),并不能像预期一样起到加快查询的作用。因为在索引中,无法区分空值和其他的值。
CREATE INDEX idx_value ON table_name (value)
SELECT * FROM table_name WHERE value IS NULL
在此例中,即使索引 idx_value
建立了,查询时也仍然需要扫描整个表才能找到所需的行。
2.4 插入空值
当插入空值时,可以使用关键字 NULL
或者空字符串(''
)。
INSERT INTO table_name (column1, column2, column3) VALUES (1, NULL, '')
在此例中,列 column2
的值为 NULL
,列 column3
的值为空字符串。需要注意的是,在插入空字符串时,不同的数据库可能有不同的行为。
3. 总结
空值是 SQL Server 中一个非常重要的概念,有时候会引发一些困惑。理解空值的含义和使用规则,有助于更好地编写 SQL 语句,避免出现一些难以理解的异常情况。