MySQL中=不处理NULL(NULL=NULL为UNKNOWN),而<=>可安全比较NULL(NULL<=>NULL为TRUE);AND优先级高于OR,混用须加括号;字符串大小写敏感由collation决定,函数操作字段会导致索引失效。

WHERE 里用 = 和 的区别在哪
MySQL 中 = 是常规等值判断,但遇到 NULL 就失效; 是“安全等于”,能正确比较 NULL 值。比如 WHERE name = NULL 永远不返回任何行,而 WHERE name NULL 才能查出 name 为 NULL 的记录。
-
=遵循 SQL 标准三值逻辑,NULL = NULL结果是UNKNOWN,被 WHERE 当作 false 过滤掉 -
是 MySQL 特有运算符,NULL NULL返回 true,'a' NULL返回 false - 在 WHERE 条件中写
col IS NULL更通用,兼容所有数据库;但若已有大量逻辑(比如 ORM 自动生成),得留意它和=行为不一致
AND 和 OR 混用时为什么结果不对
没加括号时,MySQL 按优先级先算 AND 再算 OR,很容易误判逻辑。比如 WHERE status = 'active' OR type = 'vip' AND score > 100 实际等价于 WHERE status = 'active' OR (type = 'vip' AND score > 100),而不是你想的“活跃用户或 VIP 且高分”。
- 只要
status = 'active'成立,整条记录就命中,哪怕score是 0 也进结果集 - 想表达“活跃用户,或者是 VIP 且分数超 100”,必须写成:
WHERE status = 'active' OR (type = 'vip' AND score > 100) - 用
IN替代多个OR可读性更好,但注意IN不能处理复合条件,比如(a=1 AND b=2) OR (a=3 AND b=4)还得靠括号
字符串比较时大小写敏感怎么控制
MySQL 默认按列的 collation 决定是否区分大小写。比如 utf8mb4_general_ci 是不区分的,utf8mb4_bin 是区分的。直接在 WHERE 里改 collation 最灵活,不用动表结构。
- 临时强制不区分:
WHERE name COLLATE utf8mb4_general_ci = 'Admin' - 临时强制区分:
WHERE name COLLATE utf8mb4_bin = 'Admin' - 如果经常按大小写精确匹配,建议把字段 collation 改成
utf8mb4_bin,否则每次查询都加COLLATE会影响索引使用 - 注意:函数包装会破坏索引,比如
WHERE UPPER(name) = 'ADMIN'就无法走name索引
WHERE 条件里对字段用函数导致慢查询
只要在 WHERE 左侧对字段用了函数或表达式,比如 WHERE YEAR(create_time) = 2023,MySQL 就没法用 create_time 上的索引,只能全表扫描。
- 正确写法是把函数移到右边,用范围写法:
WHERE create_time >= '2023-01-01' AND create_time - 类似地,
WHERE SUBSTRING(phone, 1, 3) = '138'应该改成WHERE phone LIKE '138%'才能用上索引 - 如果字段是
TEXT或很长的VARCHAR,又常按前缀查询,考虑加前缀索引:INDEX idx_phone_prefix (phone(4))


















