WHERE子句必须依附于SELECT、UPDATE或DELETE语句之后,不可单独使用;字符串值须用单引号,数字和NULL不加引号;判断NULL必须用IS NULL而非=;LIKE前缀匹配可走索引,后缀匹配则导致全表扫描。

WHERE 子句写在 SELECT 后面,不是 WHERE 后面直接跟条件
很多人写 SELECT * FROM users WHERE name = 'Alice' 是对的,但一换场景就错——比如想查 ID 大于 10 且状态为 active 的用户,却写成 WHERE id > 10 AND status = 'active' 却漏了前面的 SELECT ... FROM ...。WHERE 不是独立语句,它必须依附在 SELECT、UPDATE 或 DELETE 之后。单独执行 WHERE 会报错:ERROR 1064 (42000)。
常见错误现象:
- 复制别人代码时只抄了
WHERE那一行,忘了补全前面部分 - 在 MySQL 客户端里误把
WHERE当成命令输入,结果提示语法错误
字符串比较要用单引号,数字不用引号
MySQL 对引号很敏感:字段名不加引号,字符串值必须用单引号 ' ',数字和 NULL 直接写。写成 WHERE name = "Alice"(双引号)在某些 SQL 模式下可能报错或行为异常;写成 WHERE id = '123' 虽然能运行,但会触发隐式类型转换,导致索引失效。
使用场景举例(用户表 users):
- ✅ 正确:
WHERE name = 'Alice' AND age > 25 - ❌ 错误:
WHERE name = Alice(没引号,MySQL 当字段名或关键字解析) - ❌ 隐患:
WHERE id = '100'(id是 INT 类型,加引号后无法走索引)
NULL 值不能用 = 判断,得用 IS NULL
这是最常踩的坑。MySQL 中 NULL 表示“未知”,任何与 NULL 的等值比较(包括 = NULL、!= NULL、 NULL)结果都是 UNKNOWN,不会匹配到任何行。所以 WHERE email = NULL 查不到 email 为空的记录。
正确做法只有两个:
WHERE email IS NULLWHERE email IS NOT NULL
注意:IS NULL 是运算符,不是函数,不能加括号;也不支持 IN 里写 NULL(如 WHERE status IN ('active', NULL) 无效)。
LIKE 模糊查询要注意通配符和索引失效风险
LIKE 本身不慢,慢的是写法。以 % 开头的模式(如 WHERE name LIKE '%son')会导致全表扫描,因为 B+ 树索引无法从右往左匹配。
性能影响明显:
- ✅ 可走索引:
WHERE name LIKE 'John%'(前缀匹配) - ❌ 不走索引:
WHERE name LIKE '%ohn%'或WHERE name LIKE '%hn' - ⚠️ 注意大小写:
LIKE在默认 collation 下不区分大小写,但若字段是utf8mb4_bin,则区分
如果必须做后缀搜索,考虑用全文索引(FULLTEXT)或倒排字段,而不是硬扛 LIKE '%xxx'。
事情说清了就结束。真正难的不是写对 WHERE,而是意识到 WHERE 条件顺序、数据类型、NULL 语义和索引机制是绑在一起的——改一个地方,可能同时影响正确性、性能和可维护性。


















