Skip to content

SQL Null Values

NULL 值表示数据库列中缺失、未知或不适用的数据。

默认情况下,除非指定了 NOT NULL 约束,否则表列可以包含 NULL 值。

本章讲解如何使用 IS NULL 和 IS NOT NULL 运算符正确地测试 NULL 值。

如果表中的列是可选的(即没有 NOT NULL 约束),您可以在插入新记录或更新现有记录时不对该列提供值。在这种情况下,数据库会在该字段中存储一个 NULL 值。

一个 NULL 值不同于空字符串(”)或数字零(0)。它是一个特殊标记,表示数据不存在或未知。

处理 NULL 值需要特别考虑,因为标准比较运算符(如 =、<>、<、>)在与 NULL 结合使用时不会按预期工作。例如,column = NULL 不会返回 column 为 NULL 的行;它实际上会返回 unknown(在 WHERE 子句中被视为 false)。

重要提示:NULL 不等同于 0 或空字符串。使用标准比较运算符将 NULL 与任何值(即使是另一个 NULL)进行比较都会产生 UNKNOWN,而不是 TRUE 或 FALSE。

考虑以下“Employees”表。“Address”列是可选的,可以包含 NULL 值:

EmployeeID LastName FirstName Address City

1 Hansen Ola NULL Sandnes

2 Svendson Tove Borgvn 23 Sandnes

3 Pettersen Kari NULL Stavanger

4 Jensen John Aker Brygge 5 Oslo

如果我们插入新员工记录时未指定地址,则该员工的“Address”字段将为 NULL。

我们如何根据 NULL 值过滤记录?

如前所述,不能直接使用 =、< 或 <> 等标准比较运算符来测试 NULL 值。相反,SQL 提供了 IS NULL 和 IS NOT NULL 运算符。

要选择“Address”列为 NULL 的记录,您可以使用 IS NULL 运算符。

示例:

SELECT LastName, FirstName, Address FROM Employees WHERE Address IS NULL;

结果集将包含地址未知的员工:

LastName FirstName Address

Hansen Ola NULL

Pettersen Kari NULL

提示:始终使用 IS NULL 来检查 NULL 值的存在。切勿使用 column_name = NULL。

要选择“Address”列具有已知值(即非 NULL)的记录,您可以使用 IS NOT NULL 运算符。

示例:

SELECT LastName, FirstName, Address FROM Employees WHERE Address IS NOT NULL;

结果集将包含已记录地址的员工:

LastName FirstName Address

Svendson Tove Borgvn 23

Jensen John Aker Brygge 5

COUNT(column_name)、SUM()、AVG()、MIN()、MAX() 等聚合函数通常会忽略 NULL 值。COUNT(*) 是个例外;它会计算所有行,无论特定列中是否存在 NULL 值。

可以使用 COALESCE() 等函数或数据库特定的函数,例如 IFNULL() (MySQL) 或 ISNULL() (SQL Server),在查询结果中将 NULL 值替换为默认值。这些内容将在后续章节中介绍。