MySQL NULL 值处理
NULL 的三值逻辑:不能用 = 比较,要用 IS NULL。
Key PointsNULL 表示「未知」,任何与 NULL 的比较结果都是 UNKNOWN,既非真也非假。
正确判断 NULL
SQL
SELECT * FROM users WHERE age IS NULL; -- 对
SELECT * FROM users WHERE age = NULL; -- 错,永远不成立
SELECT * FROM users WHERE age IS NOT NULL;Output
+----+----------+------+
| id | username | age |
+----+----------+------+
| 5 | erin | NULL |
+----+----------+------+NULL 参与运算
SQL
SELECT 1 + NULL, NULL = NULL, NULL <> NULL;Output
+----------+-------------+--------------+
| 1 + NULL | NULL = NULL | NULL <> NULL |
+----------+-------------+--------------+
| NULL | NULL | NULL |
+----------+-------------+--------------+NULL = NULL returns NULL, not true, so two NULLs are not treated as equal in DISTINCT/joins. Use IFNULL(col,0) or COALESCE(col,0) to treat NULL as a value.正确判断 NULL
SQL
SELECT * FROM users WHERE age IS NULL; -- 对
SELECT * FROM users WHERE age = NULL; -- 错,永远不成立
SELECT * FROM users WHERE age IS NOT NULL;Output
+----+----------+------+
| id | username | age |
+----+----------+------+
| 5 | erin | NULL |
+----+----------+------+NULL 参与运算
SQL
SELECT 1 + NULL, NULL = NULL, NULL <> NULL;Output
+----------+-------------+--------------+
| 1 + NULL | NULL = NULL | NULL <> NULL |
+----------+-------------+--------------+
| NULL | NULL | NULL |
+----------+-------------+--------------+NULL = NULL 返回 NULL 而非 1(真),所以去重/关联时两个 NULL 不会被当作相等。若想让 NULL 当 0 参与计算,用 IFNULL(col, 0) 或 COALESCE(col, 0)。