从订单表里筛掉已取消的记录,WHERE 条件里要用不等于,结果发现 <> 和 != 两种写法都能跑,用哪个?还有更坑的:字段值是 NULL 时,不等于条件怎么都筛不出预期结果,这是新手栽得最多的地方。
mysql 不等于的两种写法
<> 和 != 在 MySQL 里效果完全一样:
SELECT * FROM orders WHERE status <> 1;
SELECT * FROM orders WHERE status != 1;
<> 是 SQL 标准写法,别的数据库也认;!= 是 MySQL 提供的等价形式,好读。团队项目跟着现有风格走,一般更推荐 <>,跨数据库迁移不容易踩语法差异。
NULL 才是真正的坑
status <> 1 这个条件,对 status 为 NULL 的行返回 NULL 而不是真或假,这些行直接被 WHERE 排除。也就是说,想筛「状态不是 1」的记录,结果里既没有状态 1 的,也没有状态为空的。要保留空值行,得显式写:
WHERE status <> 1 OR status IS NULL
反过来,判断某列不是空值,不能用 <> NULL,必须写 IS NOT NULL,这是 SQL 的硬规定,没有变通写法。
NOT IN 的连带问题
NOT IN 后面的列表里只要混进一个 NULL,整个条件永远不成立,一行都查不出来。列表来自子查询时尤其隐蔽,稳妥做法是子查询里先过滤掉 NULL,或者改用 NOT EXISTS。
性能再提一句:不等于条件没法走普通的索引区间扫描,大表上 status <> 1 常常退化成全表扫描,数据量大的场景尽量改成正向条件,比如只查状态在某个小集合里的行,配合 IN 效率高得多。
一句话收尾:mysql 不等于写 <> 或 != 都行,真正要记牢的是 NULL 的三个表现——判断空值必须用 IS NOT NULL,NOT IN 遇到 NULL 全部失效,想保留空值行就手动 OR 补条件。