IS NULL 是标准且正确的空值判断方式,因为 NULL 不是值而是缺失标记,= NULL 永远返回 UNKNOWN,WHERE 中被过滤;IS NULL 和 IS NOT NULL 是专用于检测 NULL 语义的真值测试谓词。
在 SQL 中,IS NULL 是标准、正确的空值判断方式,而 = NULL 永远返回 UNKNOWN(在 WHERE 或 ON 条件中等效于 FALSE),查不到任何结果——这不是语法错误,而是由 SQL 三值逻辑(TRUE/FALSE/UNKNOWN)决定的本质行为。
SQL 中的 NULL 表示“未知”或“不适用”,它不等于任何东西,包括它自己。因此:
NULL = NULL 的结果不是 TRUE,而是 UNKNOWNNULL = 5、NULL = ''、NULL = NULL 全部返回 UNKNOWN不同于比较运算符(=、!=、> 等),IS NULL 和 IS NOT NULL 是 SQL 标准定义的**真值测试谓词**,直接作用于 NULL 的语义属性:
column IS NULL → 返回 TRUE 当且仅当 column 确实为 NULLcolumn IS NOT NULL → 返回 TRUE 当且仅当 column 有确定的非空值写 WHERE age = NULL 看似直觉,但实际等价于 WHERE UNKNOWN,整张表被跳过。例如:
SELECT * FROM users WHERE age = NULL 返回 0 行SELECT * FROM users WHERE age IS NULL → 返回那 3 行= NULL 并报错;MySQL 和 SQL Server 虽允许,但逻辑不变若需逻

IS NOT DISTINCT FROM(标准 SQL,PostgreSQL/SQL Server 支持):可安全比较两个可能为 NULL 的表达式COALESCE(a, 'default') = COALESCE(b, 'default'):将 NULL 映射为统一占位值再比较(注意类型和默认值合理性)ON a.id = b.id OR (a.id IS NULL AND b.id IS NULL) 显式覆盖 NULL 匹配场景