AND、OR 和更多条件
一个条件常常不够用:「数码类的、而且价格低于 20 的商品」「文具或者厨房用品」。WHERE 后面可以把几个条件连起来:
1SELECT name, category, price2FROM products3WHERE category = '数码' AND price < 20;
| name | category | price |
|---|---|---|
| 数据线 | 数码 | 8.50 |
| 手机壳 | 数码 | 15.00 |
AND 和 OR
AND:两边的条件都成立,这一行才留下。OR:两边有一个成立,这一行就留下。
文具和厨房用品:
1SELECT name, category2FROM products3WHERE category = '文具' OR category = '厨房';
| name | category |
|---|---|
| 笔记本 | 文具 |
| 中性笔(10 支) | 文具 |
| 水杯 | 厨房 |
| 咖啡杯 | 厨房 |
一件商品不可能同时属于两个分类,所以这里要用 OR。写成 AND 的话,一行也查不到。点单步看看 WHERE 是怎么一行一行判断的。
NOT
NOT 把后面的条件反过来:成立的变成不成立,不成立的变成成立。不是数码类的商品:
1SELECT name, category2FROM products3WHERE NOT category = '数码';
| name | category |
|---|---|
| 笔记本 | 文具 |
| 中性笔(10 支) | 文具 |
| 双肩包 | 箱包 |
| 水杯 | 厨房 |
| 咖啡杯 | 厨房 |
| 帆布袋 | 箱包 |
这里和 category <> '数码' 一样。NOT 更常和下面的 IN、BETWEEN、LIKE 一起用。
括号
AND 和 OR 写在一起时,先算 AND,再算 OR,就像算术里先乘后加。想查「数码或厨房的、价格低于 10 的商品」,下面这样写行不行?
59 元的耳机(数码)会出现在结果里吗?
1SELECT name, category, price2FROM products3WHERE category = '数码' OR category = '厨房' AND price < 10;
先算 AND:这条查询的意思其实是「数码类的,或者厨房里低于 10 元的」。耳机是数码类,满足 OR 左边,所以它留下了,价格根本没管。
用括号把 OR 括起来,它就先算:
1SELECT name, category, price2FROM products3WHERE (category = '数码' OR category = '厨房') AND price < 10;
| name | category | price |
|---|---|---|
| 数据线 | 数码 | 8.50 |
| 咖啡杯 | 厨房 | 9.90 |
小技巧: AND 和 OR 混在一起时,总是加上括号。就算顺序本来就对,读的人也一眼就明白。
IN:几个值里的一个
OR 一多就很长。IN 后面在括号里列出几个值,等于其中任何一个就算成立:
1SELECT name, city2FROM customers3WHERE city IN ('北京', '上海', '杭州');
| name | city |
|---|---|
| 林晓 | 上海 |
| 王磊 | 北京 |
| 陈静 | 上海 |
| 赵敏 | 北京 |
| 周婷 | 上海 |
| 郑雪 | 杭州 |
这和写三个 city = … 再用 OR 连起来一样。反过来,NOT IN (…) 是「哪个都不等于」。
BETWEEN:一个范围
BETWEEN 小 AND 大 查一个范围,两头都包括:
1SELECT name, price2FROM products3WHERE price BETWEEN 9.90 AND 15;
| name | price |
|---|---|
| 水杯 | 12.00 |
| 咖啡杯 | 9.90 |
| 手机壳 | 15.00 |
| 帆布袋 | 11.00 |
9.90 元的咖啡杯和 15 元的手机壳都在里面。日期也能用,10 月上半月的订单(10 月 15 日也算):
1SELECT id, order_date2FROM orders3WHERE order_date BETWEEN '2025-10-01' AND '2025-10-15';
| id | order_date |
|---|---|
| 5 | 2025-10-01 |
| 6 | 2025-10-03 |
| 7 | 2025-10-10 |
| 8 | 2025-10-12 |
| 9 | 2025-10-15 |
LIKE:按文字的一部分找
= 要一字不差。只知道文字的一部分,用 LIKE 和两个特殊符号:
| 符号 | 意思 |
|---|---|
% | 任意多个字符,0 个也行 |
_ | 正好一个字符 |
名字以「杯」结尾的商品:
1SELECT name2FROM products3WHERE name LIKE '%杯';
| name |
|---|
| 水杯 |
| 咖啡杯 |
邮箱 @ 前面正好 3 个字符的客户(三个 _,后面跟 @ 和 %):
1SELECT name, email2FROM customers3WHERE email LIKE '___@%';
| name | |
|---|---|
| 林晓 | [email protected] |
| 王磊 | [email protected] |
LIKE 在 MySQL 里也不区分英文字母的大小写;别的数据库可能区分(PostgreSQL 不区分大小写要用 ILIKE)。
练一练
写好查询,点检查。提示随便看,实在想不出来再看答案。
库存不多不少
✓查出库存在 10 到 40 之间(10 和 40 都算)的商品,显示 name 和 stock 两列。
| name | stock |
|---|---|
| 双肩包 | 15 |
| 水杯 | 40 |
| 耳机 | 10 |
| 手机壳 | 35 |
| 帆布袋 | 25 |
1SELECT name, stock2FROM products;
修好它:括号
✓想查数码类和箱包类里、库存超过 20 的商品,可是结果多了两行。改好它,显示 name、category、stock 三列。
| name | category | stock |
|---|---|---|
| 数据线 | 数码 | 200 |
| 手机壳 | 数码 | 35 |
| 帆布袋 | 箱包 | 25 |
1SELECT name, category, stock2FROM products3WHERE category = '数码' OR category = '箱包' AND stock > 20;
四个字母的邮箱
✓查出邮箱 @ 前面正好 4 个字符的客户,显示 name 和 email 两列。
| name | |
|---|---|
| 刘洋 | [email protected] |
| 周婷 | [email protected] |
1SELECT name, email2FROM customers;
这一课学会了
AND要两边都成立,OR有一边成立就行,NOT把条件反过来。- 先算
AND再算OR;混在一起时加括号。 IN (值, 值, …)等于其中任何一个;NOT IN哪个都不等于。BETWEEN 小 AND 大查一个范围,两头都包括,数字和日期都能用。LIKE按文字的一部分找:%是任意多个字符,_是正好一个。