之前我写过一篇文章,讨论了
COUNT(*)
和
COUNT(column)
在语义上是不同的
(链接
)
。如果被计数的列中包含 NULL 值,这些查询可能会返回不同的结果。这种差异源于 NULL 不是一个具体的值,而是一种状态,表示“值未知”或“未输入值”。
因此,如果你是 DBA 或数据库开发人员,最好理解 NULL 如何在你编写的SQL 的使用。
在数据库中,NULL 是一个特殊的值,表示“未知”或“不存在”。然而,很多人常常误解 NULL 的含义,尤其是将其与零(0)或空字符串('')混淆。实际上,NULL 与这些值完全不同。
NULL 的含义
NULL 表示缺少值或未知值。它不是一个具体的值,而是一个占位符,表示某个字段没有数据。例如,在一个包含员工信息的表中,如果某个员工的电话号码未知,那么该字段的值可以是 NULL,而不是空字符串或零。
NULL 与零的区别
零(0)是一个具体的数值,表示“没有数量”或“零值”。而 NULL 表示“未知”或“不存在”。例如,如果一个员工的工资字段是 NULL,这意味着我们不知道他的工资是多少;而如果工资字段是 0,这意味着我们知道他的工资是零。
NULL 与空字符串的区别
空字符串('')表示一个字符串类型的字段确实有一个值,但这个值是空的。而 NULL 表示该字段没有值。例如,如果一个员工的电子邮件字段是空字符串,这意味着我们知道他没有电子邮件地址;而如果电子邮件字段是 NULL,这意味着我们不知道他是否有电子邮件地址。
在 SQL 中使用 NULL
在 SQL 查询中,NULL 的处理方式与其他值不同。例如,使用
= 或
!= 来比较 NULL 是无效的,因为 NULL 表示未知值。正确的做法是使用
IS NULL 或
IS NOT NULL 来判断某个字段是否为 NULL。
SELECT * FROM employees WHERE email IS NULL;
这里再举一个例子,说明对 NULL 的误解可能会导致应用程序返回与预期不同的结果。
我将创建一个包含两行数据的小表:
SQL> create table t(a int); Table created. SQL> insert into t values(1); 1 row created. SQL> insert into t values(null); 1 row created. SQL> select avg(a) from t; AVG(A)---------- 1
当我计算这两行值的平均值时,得到的结果是 1。
现在,让我们将 NULL(无值)更新为 0(一个实际的零值)。
SQL> update t set a=0 where a is null; 1 row updated. SQL> select avg(a) from t; AVG(A)---------- .5
如你所见,由于现在另一行中有一个实际的值(而不是“无值”),
AVG 函数会将这个零值纳入计算。
希望这再次说明,NULL 并不意味着零或任何其他值,它表示的是
没有值。如果你对 NULL 进行聚合函数(如
COUNT、
AVG)操作,你必须理解 Oracle 将 NULL 视为无值,并且不会将这些“无值”纳入计算。因此,你的查询行为可能会与你的直觉预期不同。
总结
NULL 是一个特殊的值,表示“未知”或“不存在”。它与零或空字符串不同,理解这一点对于正确使用数据库非常重要。在处理 NULL 时,务必使用正确的 SQL 语法,以避免逻辑错误。
希望这篇文章能帮助你更好地理解 NULL 的含义及其在数据库中的使用。
