IS NOT NULL 是唯一正确的非空判断语法,必须指定列名,适用于所有主流数据库;WHERE col != NULL 无效,空字符串需额外处理;视图中应将 IS NOT NULL 写入 WHERE 子句以确保过滤生效。

WHERE column IS NOT NULL 才是正确写法
WHERE NOT NULL 不是合法 SQL 语法,直接写会报错 ERROR: syntax error at or near "NOT"。SQL 中判断非空必须用 IS NOT NULL,且必须指定具体列名。视图定义里如果漏掉列名或误写成 WHERE col != NULL(NULL 不能用 = 比较),查询结果可能全为空或逻辑错误。
-
IS NOT NULL是唯一标准写法,适用于所有主流数据库(PostgreSQL、MySQL、SQL Server、Oracle) -
!= NULL或<> NULL永远返回UNKNOWN,整行被过滤掉,看似“生效”,实则掩盖逻辑缺陷 - 字符串列还需注意:空字符串
''和NULL不同,IS NOT NULL不排除'',必要时要额外加AND column != ''
在 CREATE VIEW 语句中嵌入过滤条件
视图本身不存储数据,所以把 IS NOT NULL 条件写进 SELECT 的 WHERE 子句,才能让后续查视图时自动跳过空值行。例如:
CREATE VIEW active_users AS SELECT id, name, email FROM users WHERE email IS NOT NULL AND name IS NOT NULL;
- 视图定义一旦创建,后续
SELECT * FROM active_users就天然不含email或name为NULL的行 - 不要在应用层再加一遍
WHERE email IS NOT NULL,否则冗余且易错 - 如果视图基于多个表 JOIN,需明确指定来自哪张表的列,避免歧义,如
users.email IS NOT NULL
NULL 值在 WHERE 和 JOIN 中的行为差异
同一个列,在 WHERE 里用 IS NOT NULL 过滤,和在 ON 条件里用它控制关联,效果完全不同:
WHERE t1.col IS NOT NULL:先完成 JOIN,再从结果里剔除t1.col为空的行ON t1.col = t2.col AND t1.col IS NOT NULL:JOIN 阶段就排除t1.col为空的记录,可能减少中间结果集大小多表视图中,若某列仅用于关联且允许为空,但业务上要求关联有效,就把
IS NOT NULL放进ON而非WHERELEFT JOIN后接WHERE right_table.id IS NOT NULL,实际等价于INNER JOIN,容易误伤外连接语义
性能与索引注意事项
IS NOT NULL 条件能否走索引,取决于数据库和索引类型:
PostgreSQL 和 MySQL 8.0+ 支持对可空列建普通 B-tree 索引,并能用该索引加速
IS NOT NULL查询但 SQLite 默认不优化
IS NOT NULL,可能触发全表扫描如果列上有函数索引(如
CREATE INDEX idx ON tbl ((col IS NOT NULL))),某些场景下能提升过滤效率,但属非常规手段不要假设
IS NOT NULL自动高效;大表上线前务必用EXPLAIN看执行计划视图嵌套多层时,外层视图的
IS NOT NULL过滤无法下推到内层,可能导致多余计算
NULL 的语义模糊性常常藏在细节里:它既不是值,也不参与比较运算,更不会被大多数聚合函数计入(COUNT(*) 除外)。写视图时少一层 IS NOT NULL,可能让下游应用收到意外的空数据。

















