Kodewick
第 3 课,共 21 课目录

AND、OR 和更多条件

第 3 课,共 21 课 · 第 1 部分 · 查数据 · 约 15 分钟

一个条件常常不够用:「数码类的、而且价格低于 20 的商品」「文具或者厨房用品」。WHERE 后面可以把几个条件连起来:

main.sql
1SELECT name, category, price2FROM products3WHERE category = '数码' AND price < 20;
输出
namecategoryprice
数据线数码8.50
手机壳数码15.00
2 行

AND 和 OR

  • AND:两边的条件都成立,这一行才留下。
  • OR:两边有一个成立,这一行就留下。

文具和厨房用品:

main.sql
1SELECT name, category2FROM products3WHERE category = '文具' OR category = '厨房';
输出
namecategory
笔记本文具
中性笔(10 支)文具
水杯厨房
咖啡杯厨房
4 行

一件商品不可能同时属于两个分类,所以这里要用 OR。写成 AND 的话,一行也查不到。点单步看看 WHERE 是怎么一行一行判断的。

NOT

NOT 把后面的条件反过来:成立的变成不成立,不成立的变成成立。不是数码类的商品:

main.sql
1SELECT name, category2FROM products3WHERE NOT category = '数码';
输出
namecategory
笔记本文具
中性笔(10 支)文具
双肩包箱包
水杯厨房
咖啡杯厨房
帆布袋箱包
6 行

这里和 category <> '数码' 一样。NOT 更常和下面的 IN、BETWEEN、LIKE 一起用。

括号

AND 和 OR 写在一起时,先算 AND,再算 OR,就像算术里先乘后加。想查「数码或厨房的、价格低于 10 的商品」,下面这样写行不行?

先猜一猜

59 元的耳机(数码)会出现在结果里吗?

1SELECT name, category, price2FROM products3WHERE category = '数码' OR category = '厨房' AND price < 10;

用括号把 OR 括起来,它就先算:

main.sql
1SELECT name, category, price2FROM products3WHERE (category = '数码' OR category = '厨房') AND price < 10;
输出
namecategoryprice
数据线数码8.50
咖啡杯厨房9.90
2 行

小技巧: AND 和 OR 混在一起时,总是加上括号。就算顺序本来就对,读的人也一眼就明白。

IN:几个值里的一个

OR 一多就很长。IN 后面在括号里列出几个值,等于其中任何一个就算成立:

main.sql
1SELECT name, city2FROM customers3WHERE city IN ('北京', '上海', '杭州');
输出
namecity
林晓上海
王磊北京
陈静上海
赵敏北京
周婷上海
郑雪杭州
6 行

这和写三个 city = … 再用 OR 连起来一样。反过来,NOT IN (…) 是「哪个都不等于」。

BETWEEN:一个范围

BETWEEN 小 AND 大 查一个范围,两头都包括:

main.sql
1SELECT name, price2FROM products3WHERE price BETWEEN 9.90 AND 15;
输出
nameprice
水杯12.00
咖啡杯9.90
手机壳15.00
帆布袋11.00
4 行

9.90 元的咖啡杯和 15 元的手机壳都在里面。日期也能用,10 月上半月的订单(10 月 15 日也算):

main.sql
1SELECT id, order_date2FROM orders3WHERE order_date BETWEEN '2025-10-01' AND '2025-10-15';
输出
idorder_date
52025-10-01
62025-10-03
72025-10-10
82025-10-12
92025-10-15
5 行

LIKE:按文字的一部分找

= 要一字不差。只知道文字的一部分,用 LIKE 和两个特殊符号:

符号意思
%任意多个字符,0 个也行
_正好一个字符

名字以「杯」结尾的商品:

main.sql
1SELECT name2FROM products3WHERE name LIKE '%杯';
输出
name
水杯
咖啡杯
2 行

邮箱 @ 前面正好 3 个字符的客户(三个 _,后面跟 @ 和 %):

main.sql
1SELECT name, email2FROM customers3WHERE email LIKE '___@%';
输出
2 行

LIKE 在 MySQL 里也不区分英文字母的大小写;别的数据库可能区分(PostgreSQL 不区分大小写要用 ILIKE)。

练一练

写好查询,点检查。提示随便看,实在想不出来再看答案。

练习 1

库存不多不少

查出库存在 10 到 40 之间(10 和 40 都算)的商品,显示 name 和 stock 两列。

要显示
namestock
双肩包15
水杯40
耳机10
手机壳35
帆布袋25
5 行
exercise1.sql
1SELECT name, stock2FROM products;
输出
点「运行」或按 Ctrl+Enter
练习 2

修好它:括号

想查数码类和箱包类里、库存超过 20 的商品,可是结果多了两行。改好它,显示 name、category、stock 三列。

要显示
namecategorystock
数据线数码200
手机壳数码35
帆布袋箱包25
3 行
exercise2.sql
1SELECT name, category, stock2FROM products3WHERE category = '数码' OR category = '箱包' AND stock > 20;
输出
点「运行」或按 Ctrl+Enter
练习 3

四个字母的邮箱

查出邮箱 @ 前面正好 4 个字符的客户,显示 name 和 email 两列。

要显示
2 行
exercise3.sql
1SELECT name, email2FROM customers;
输出
点「运行」或按 Ctrl+Enter

这一课学会了

  • AND 要两边都成立,OR 有一边成立就行,NOT 把条件反过来。
  • 先算 AND 再算 OR;混在一起时加括号。
  • IN (值, 值, …) 等于其中任何一个;NOT IN 哪个都不等于。
  • BETWEEN 小 AND 大 查一个范围,两头都包括,数字和日期都能用。
  • LIKE 按文字的一部分找:% 是任意多个字符,_ 是正好一个。