IS NOT NULL是标准SQL语法,必须带空格;ISNOTNULL因违反SQL词法解析规则被识别为未定义标识符而报错,所有主流数据库均不支持连写形式。
IS NOT NULL 不是标准 SQL 的语法,直接写 ISNOTNULL 会报错 —— 正确写法是 IS NOT NULL(中间有空格)。
ISNOTNULL 会报错?SQL 标准中,IS 是一个一元谓词操作符,必须和 NOT NULL 组合使用,不能连写。几乎所有主流数据库(PostgreSQL、MySQL、SQL Server、Oracle、SQLite)都只认 IS NOT NULL,写成 ISNOTNULL 会被解析为未定义标识符或语法错误。
ERROR 1064 (42000): You have an error in your SQL syntax
ERROR: operator does not exist: text = isnotnull(误把 ISNOTNULL 当作列名或函数)ISNOTNULL —— 它不是函数,也不是保留字组合IS NOT NULL 条件?它只能用于 WHERE 或 HAVING 子句中,作用是排除该字段值为 NULL 的行。注意:空字符串 ''、数字 0、布尔 FALSE 都不是 NULL,它们会被保留。
SELECT * FROM users WHERE email IS NOT NULL;
WHERE first_name IS NOT NULL AND last_name IS NOT NULL
!= 混用是错的:email != NULL 永远返回 UNKNOWN(SQL 三值逻辑),不会匹配任何行NULL 和空字符串?得额外加条件:email IS NOT NULL AND email != ''
IS NOT NULL 在不同数据库里有啥差异?语法统一,但行为细节略有差别:
TEXT 或 JSON 字段,IS NOT NULL 只检查是否为 NULL,不校验内容有效性(比如 JSON 字段存了无效 JSON 字符串,仍算“非 NULL”)CREATE INDEX idx ON tbl ((col IS NOT NULL)),能加速 IS NOT NULL 查询WHERE col IS NOT NULL,查询可能走索引;否则全表扫描IS NOT NULL 无法使用普通 B-tree 索引加速(除非建函数索引或过滤索引),性能敏感场景要留意很多人以为设了 DEFAULT 'N/A' 就不会出现 NULL,但显式插入 NULL 仍会绕过默认值;另外,CASE 或计算字段结果也可能产出 NULL。
NULL → 值为 NULL(哪怕有 DEFAULT,也只在显式用 DEFAULT 关键字或省略该列时生效)COALESCE(status, 'pending') 返回非 NULL,但原始 status 列本身仍可能是 NULL
CASE WHEN x > 0 THEN 'yes' END 在条件不满足时返回 NULL,不是空字符串IS NOT NULL 筛选前,先用 SELECT col, COUNT(*) FROM t GROUP BY col 看看实际有哪些值,比凭经验猜更可靠真正麻烦的不是语法写错,而是误以为“非 NULL 就等于有业务意义的数据”——比如手机号字段非 NULL,但存了 '000-000-0000' 或 '123',这种数据 IS NOT NULL 挡不住。