MySQL WHERE 子句
用 WHERE 过滤行:比较、范围、逻辑、模糊匹配。
Key PointsWHERE 决定「哪些行」进入结果集;条件可用 AND/OR 组合、用括号改变优先级。
比较与逻辑
SQL
SELECT * FROM users
WHERE age >= 30 AND age <= 40;
SELECT * FROM users
WHERE age < 18 OR age > 60;Output
+----+----------+-----+
| id | username | age |
+----+----------+-----+
| 2 | bob | 32 |
| 4 | dave | 41 |
+----+----------+-----+IN 与 BETWEEN
SQL
SELECT * FROM users WHERE age IN (25, 32);
SELECT * FROM users WHERE age BETWEEN 25 AND 40;Output
+----+----------+-----+
| id | username | age |
+----+----------+-----+
| 2 | bob | 32 |
| 3 | carol | 25 |
+----+----------+-----+模糊匹配 LIKE
SQL
SELECT * FROM users WHERE email LIKE '%@example.com';
SELECT * FROM users WHERE username LIKE 'a%'; -- 以 a 开头% matches any length, _ matches one char. A leading % (e.g. %example) defeats the index and forces a full scan.
**Never test NULL with
=** — use IS NULL / IS NOT NULL. WHERE email = NULL never matches; it is the classic beginner trap.比较与逻辑
SQL
SELECT * FROM users
WHERE age >= 30 AND age <= 40;
SELECT * FROM users
WHERE age < 18 OR age > 60;Output
+----+----------+-----+
| id | username | age |
+----+----------+-----+
| 2 | bob | 32 |
| 4 | dave | 41 |
+----+----------+-----+IN 与 BETWEEN
SQL
SELECT * FROM users WHERE age IN (25, 32);
SELECT * FROM users WHERE age BETWEEN 25 AND 40;Output
+----+----------+-----+
| id | username | age |
+----+----------+-----+
| 2 | bob | 32 |
| 3 | carol | 25 |
+----+----------+-----+模糊匹配 LIKE
SQL
SELECT * FROM users WHERE email LIKE '%@example.com';
SELECT * FROM users WHERE username LIKE 'a%'; -- 以 a 开头% 匹配任意长度,_ 匹配单个字符。LIKE 前缀有索引可用,但 %xx 开头的前缀模糊会导致索引失效、走全表扫描。
**NULL 不能用
= 判断**,要用 IS NULL / IS NOT NULL:WHERE email = NULL 永远不命中,这是新手最常踩的坑。