第32期 NULL 不是零!

来源:这里教程网 时间:2026-03-03 21:34:30 作者:

之前我写过一篇文章,讨论了  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 的含义及其在数据库中的使用。  

相关推荐