NULL 值指定了未知或不适用的值。
NULL
NULL 是一个特殊值,它不同于任何数据类型的任何有效值。然而,NULL 值在任何数据类型中都是合法值。NULL 用于表示缺少或不适用的信息。NULL 有两种截然不同的使用情况:
情况 | 说明 |
---|---|
缺少 | 字段具有值,但该值未知。 |
不适用 | 字段不适用于特定的行。 |
SQL 允许在创建列时带有 NOT NULL 限制。这意味着那些特殊的列不能包含 NULL。
NULL 值将三值逻辑的概念引入 SQL。NULL 值通过任何比较运算符与任何值(包括 NULL 值)进行比较时都是"UNKNOWN"。返回 TRUE 的唯一搜索条件是 IS NULL 谓语。在 SQL 中,只有 WHERE 子句中搜索条件的值为 TRUE 时才选择行;不选择值为 UNKNOWN 或 FALSE 的行。
NULL 值的列空间占用率是每列 1 位,而分配的空间是 8 位的整数倍。在允许 NULL 值的表中,NULL 位的占用在列数的基础上是固定不变的。
IS [ NOT ] truth-value 子句(其中 truth-value 是 TRUE、FALSE 或 UNKNOWN 中的一个)可用于选择包含 NULL 值的行。有关此子句的说明,请参见搜索条件。
以下示例中,列 Salary 包含 NULL。
条件 | 真值 | 是否选择? |
---|---|---|
Salary = NULL | UNKNOWN | NO |
Salary <> NULL | UNKNOWN | NO |
NOT (Salary = NULL) | UNKNOWN | NO |
NOT (Salary <> NULL) | UNKNOWN | NO |
Salary = 1000 | UNKNOWN | NO |
Salary IS NULL | TRUE | YES |
Salary IS NOT NULL | FALSE | NO |
Salary = expression IS UNKNOWN | TRUE | YES |
同样的规则也适用于比较两个不同表中的列。因此,将两个表连接到一起不会选择其所比较的任何一列含有 NULL 值的行。
用于数字表达式时,NULL 还有一个有趣的属性。任何涉及 NULL 值的数字表达式的结果都为 NULL。这意味着,如果将 NULL 加上一个数字,结果为 NULL,而不是数字。如果想将 NULL 视为 0,则必须使用 ISNULL( expression, 0 ) 函数。
公式化 SQL 查询时的很多常见错误是由 NULL 的行为引起的。必须小心避免这些问题。有关组合搜索条件时三值逻辑的作用的说明,请参见搜索条件。
在集合操作(UNION、INTERSECT、EXCEPT)和 DISTINCT 操作中,会针对不同的搜索条件对 NULL 进行不同的处理。包含 NULL 而其余列均相同的行在此类操作中被视为相同。
例如,在表 T1 的所有行中名为 redundant 的列的值均为 NULL,则下面的语句将返回一个单独的行:
SELECT DISTINCT redundant FROM T1; |
必须连接到数据库。
无。
SQL/2003 核心特性。
Sybase 在有些环境中,Adaptive Server Enterprise 将 NULL 按值处理,而 SQL Anywhere 不是这样。例如,在 SQL Anywhere 中,使用以下 WHERE 子句所查询的结果中不包括 c1 列中为 NULL 的行,因为条件的值为 UNKNOWN:
WHERE NOT( C1 = NULL ) |
在 Adaptive Server Enterprise 中,条件的值为 TRUE,因此返回这些行。为了兼容,应该使用 IS NULL 而不是比较运算符。
SQL Anywhere 中的唯一索引可以包含带有 NULL 且其它值相同的行。而 Adaptive Server Enterprise 中的唯一索引不允许这样的条目。
如果使用 jConnect,则 tds_empty_string_is_null 选项将控制返回的空字符串是作为 NULL 字符串,还是作为包含一个空白字符的字符串。
有关详细信息,请参见tds_empty_string_is_null 选项 [数据库]。
以下 INSERT 语句将一个 NULL 值插入到表 Borrowed_book 的 date_returned 列中。
INSERT INTO Borrowed_book ( date_borrowed, date_returned, book ) VALUES ( CURRENT DATE, NULL, '1234' ); |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |