在 MySQL 中,a = null
和 a is null
是有本质区别的,主要在于它们如何处理 NULL
值。
在 MySQL(以及大多数遵循 SQL 标准的数据库)中,如果你想检查一个列的值是否为 NULL
,请务必使用 IS NULL
或 IS NOT NULL
,而不是 =
或 !=
。
表达式 | 目的 | 当 a 是 NULL 时的结果 | 当 a 不是 NULL 时的结果 | 是否正确/推荐 |
---|---|---|---|---|
a = null | (错误地) 尝试比较值是否等于 NULL | UNKNOWN (视为 FALSE ) | UNKNOWN (视为 FALSE ) | 否 |
a is null | 正确地 检查值是否为 NULL | TRUE | FALSE | 是 |
a is not null | 正确地 检查值是否 不是 NULL | FALSE | TRUE | 是 |
核心区别:
-
a is null
:这是 正确 且 标准 的检查列a
的值是否为NULL
的方式。 -
a = null
:这 不是 检查值是否为NULL
的标准方式,并且在大多数情况下 不会 按预期工作。
一、NULL
的特殊性
-
NULL
在 SQL 中代表“未知”、“缺失”或“不适用”的值。它不是一个具体的值(如 0 或空字符串 '')。 -
根据 SQL 标准,任何与
NULL
进行的常规比较(使用=
,<
,>
,<>
,!=
等操作符)的结果都是UNKNOWN
(未知)。在WHERE
子句中,UNKNOWN
的结果通常被视为FALSE
,因此不会匹配任何行。
-
a = null
的行为-
当你写
WHERE a = null
时,MySQL 会尝试将列a
中的值与NULL
进行比较。 -
如果
a
的值不是NULL
(例如a = 5
):5 = null
的结果是UNKNOWN
。 -
如果
a
的值本身就是NULL
:null = null
的结果 仍然是UNKNOWN
。这是因为你无法确定一个未知值是否等于另一个未知值。 -
结论:因此,
WHERE a = null
这个条件永远不会为TRUE
,它 无法 帮你筛选出a
列值为NULL
的行。
-
-
a is null
的行为-
SQL 提供了专门的操作符
IS NULL
和IS NOT NULL
来处理NULL
值的检查。 -
IS NULL
是一个 类型检查 操作符,它直接判断一个值 是否为NULL
类型。 -
如果
a
的值是NULL
:a is null
的结果是TRUE
。 -
如果
a
的值不是NULL
:a is null
的结果是FALSE
。 -
结论:因此,
WHERE a is null
是筛选出a
列值为NULL
的行的 正确且唯一可靠 的方法。
-
二、类比:
想象 NULL
是一个“不知道里面是什么”的盒子。
-
a = null
就像在问:“这个盒子里的东西,和那个‘不知道里面是什么’的盒子里的东西,是一样的吗?” 答案永远是:“不知道”(UNKNOWN
)。 -
a is null
就像在问:“这个盒子 是不是 ‘不知道里面是什么’的盒子?” 答案是明确的:“是” (TRUE
) 或 “不是” (FALSE
)。