MySQL中NULL表示未知或缺失值,需用IS NULL/IS NOT NULL判断;可用COALESCE/IFNULL替换默认值;聚合函数忽略NULL,COUNT(*)与COUNT(col)行为不同;建表应合理设NOT NULL与DEFAULT;LEFT JOIN中WHERE过滤NULL需谨慎。
MySQL 中的 NULL 表示“未知”或“缺失值”,它不是空字符串('')也不是数字 0,而是一个特殊的标记。直接用 = 或 != 判断 NULL 会返回 NULL(即逻辑上“未知”),导致查询结果不符合预期。正确处理 NULL 是写可靠 SQL 的基础。
不能写 WHERE col = NULL 或 WHERE col != NULL,这永远不成立。必须使用专用操作符:
WHERE col IS NULL —— 找出该列为 NULL 的记录WHERE col IS NOT NULL —— 找出该列非 NULL 的记录IS NULL 和 IS NOT NULL 是操作符,不是函数,不加括号当需要把 NULL 显示为默认值(如 0、'未知'、当前时间等),推荐用 COALESCE()(标准 SQL,支持多参数)或 IFNULL()(MySQL 特有,仅两个参数):
SELECT COALESCE(phone, '未填写') FROM users; —— 返回第一个非 NULL 值SELECT IFNULL(age, 0) FROM users; —— age 为 NULL 时返回 0定义字段时明确是否允许 NULL,比后期补救更安全:
NOT NULL 约束,配合 DEFAULT 值,避免意外 NULLstatus TINYINT NOT NULL DEFAULT 1
先设为 NOT NULL;对可选字段(如备注、头像 URL)可允许 NULL,但要在业务层或 SQL 中主动处理LEFT JOIN 右表无匹配时,右表字段全为 NULL。若在 WHERE 条件中误加 right_table.col = 'x',会把整行过滤掉(因为 NULL = 'x' 为 FALSE),实际应改用 ON 条件或显式允许 NULL:
LEFT JOIN orders ON u.id = o.user_id WHERE o.status = 'paid' —— 把没订单的用户也排除了LEFT JOIN orders ON u.id = o.user_id AND o.status = 'paid',或在 WHERE 中写 o.status = 'paid' OR o.status IS NULL