📚 目录

  1. 概述
  2. NULL 值的定义
  3. NULL 与空字符串
  4. 使用 IS NULLIS NOT NULL
  5. NULL 值与逻辑运算符
  6. NULL 值与聚合函数
  7. COALESCENULLIF 函数
  8. 参考资料

🛠️ 概述

在 PostgreSQL 中,NULL 是一个特殊的标记,用于表示缺失、未知或不适用的数据。NULL 不等同于空字符串、零或任何其他值。它是一个独立的概念,用于表示某个字段没有值或该值尚未定义。处理 NULL 值时需要特别注意,尤其是在进行比较、计算和聚合操作时。


📝 NULL 值的定义

NULL 用于表示“没有值”或“值未知”。在 PostgreSQL 中,NULL 可以存储在任何数据类型的列中。

  • 空值:一个字段包含 NULL,意味着这个字段的数据是缺失的或不适用的,而不是空字符串或者零。 示例: INSERT INTO employees (name, department) VALUES ('John Doe', NULL); 上面的例子中,department 字段为 NULL,意味着 John Doe 没有指定部门。

📝 NULL 与空字符串

尽管 NULL 和空字符串看起来可能相似,但它们是不同的:

  • NULL:表示缺失或未知的值。
  • 空字符串:是一个有效的值,表示字段包含一个长度为零的字符串。

例如,在数据库查询中,NULL 和空字符串是不能互换的:

-- 这是一个NULL值
SELECT * FROM employees WHERE department IS NULL;

-- 这是一个空字符串
SELECT * FROM employees WHERE department = '';


📝 使用 IS NULLIS NOT NULL

在 SQL 查询中,不能使用常规的比较运算符(如 =!=)来直接与 NULL 进行比较。相反,应该使用 IS NULLIS NOT NULL 来检查字段是否为 NULL

示例(查找部门为空的员工):

SELECT * FROM employees WHERE department IS NULL;

示例(查找部门不为空的员工):

SELECT * FROM employees WHERE department IS NOT NULL;


📝 NULL 值与逻辑运算符

NULL 值在逻辑运算中会影响结果。逻辑运算符(如 ANDOR)和比较运算符(如 =, !=)与 NULL 一起使用时,结果会返回 UNKNOWN,而不是 TRUEFALSE

示例:

SELECT * FROM employees WHERE department = NULL;

上面的查询不会返回任何结果,因为 NULL 与任何值的比较会返回 UNKNOWN。正确的查询方式是使用 IS NULL

SELECT * FROM employees WHERE department IS NULL;


📝 NULL 值与聚合函数

在 PostgreSQL 中,聚合函数(如 COUNTAVGSUM)会自动忽略 NULL 值。例如,COUNT 只会计数非 NULL 的行,而 AVGSUM 会忽略包含 NULL 的行。

示例(计算非空部门的员工数量):

SELECT COUNT(department) FROM employees;

该查询将返回 department 列中所有非 NULL 的员工数量。

如果你希望将 NULL 值也计入在内,可以使用 COUNT(*),它会计算表中的所有行,包括 NULL 值:

SELECT COUNT(*) FROM employees;


📝 COALESCENULLIF 函数

  • COALESCECOALESCE 函数返回其参数中的第一个非 NULL 值。如果所有参数都是 NULL,则返回 NULL。 示例(返回非空值): SELECT COALESCE(department, 'Unknown') FROM employees; 该查询将返回 department 列的值,如果是 NULL,则返回 'Unknown'
  • NULLIFNULLIF 函数比较两个表达式,如果它们相等,则返回 NULL,否则返回第一个表达式的值。 示例(避免除零错误): SELECT NULLIF(salary, 0) FROM employees; 如果 salary0,则返回 NULL;否则返回 salary 的实际值。

📘 参考资料