在 MySQL 中,
WHERE子句用于筛选满足特定条件的记录,是
SELECT、
UPDATE、
DELETE等语句中最常用、最关键的过滤工具。用好
WHERE,核心在于准确表达逻辑关系和正确处理数据类型。
基础语法与常见写法
WHERE必须紧跟在
FROM(或
JOIN)之后,支持单个条件或多条件组合。基本结构如下:
SELECT * FROM users WHERE age > 18;
UPDATE orders SET status = 'shipped' WHERE order_id = 1001;
注意:字符串值要用单引号(
'admin'),数字可不加引号(但推荐统一用引号避免隐式转换问题),NULL 要用
IS NULL判断,不能用
= NULL。
多条件组合与逻辑运算符
使用
AND、
OR、
NOT连接多个条件,优先级为
NOT>
AND>
OR,复杂逻辑建议用括号明确分组: SELECT * FROM products WHERE category = 'book' AND price BETWEEN 20 AND 80; SELECT * FROM users WHERE city = 'Beijing' OR city = 'Shanghai';(等价于
city IN ('Beijing','Shanghai'))
SELECT * FROM logs WHERE level != 'DEBUG' AND created_at >= '2024-01-01';
常用条件表达式与易错点
除了常规比较(
=、
>、),这些操作符高频实用且容易出错: IN / NOT IN:适用于枚举多个固定值,注意
IN中含
NULL会导致整条条件结果为
UNKNOWN,查不到数据 LIKE:模糊匹配,
%匹配任意长度字符,
_匹配单个字符;中文或带特殊字符时注意转义(如
\_)和索引失效风险 IS NULL / IS NOT NULL:判断空值唯一安全方式,
= NULL永远返回 false BETWEEN ... AND ...:闭区间,包含两端值,且要求前后值顺序正确(
BETWEEN 10 AND 5不生效)
性能与索引注意事项
WHERE条件是否能走索引,直接影响查询速度: 尽量在
WHERE中使用索引列做等值或范围查询(如
WHERE status = 'active') 避免在索引列上使用函数或表达式(如
WHERE YEAR(create_time) = 2024会跳过索引) 对文本字段用
LIKE时,前导通配符(
LIKE '%abc')无法使用 B+Tree 索引,可考虑全文索引或倒序存储优化 用
EXPLAIN查看执行计划,确认
type是否为
ref或
range,
key是否显示用了哪个索引
