Kodewick
第 2 课,共 21 课目录

WHERE:挑出想要的行

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

上一课的查询每次都把表里的行全部查出来。可多数时候你只要其中一部分:便宜的商品、上海的客户、还没发货的订单。这就是 WHERE 做的事:

main.sql
1SELECT name, price2FROM products3WHERE price < 10;
输出
nameprice
笔记本4.50
中性笔(10 支)6.00
数据线8.50
咖啡杯9.90
4 行

10 件商品里,价格低于 10 的只有这 4 件。

WHERE 怎么挑行

WHERE 后面写一个条件。数据库拿到整张表以后,一行一行地看:条件成立,这一行留下;不成立,这一行去掉。最后才由 SELECT 挑出要显示的列。

main.sql
1SELECT name, stock2FROM products3WHERE stock > 50;
输出
namestock
笔记本120
中性笔(10 支)80
数据线200
咖啡杯60
4 行

点这段代码的单步,能看到它的每一步:先是 FROM 拿到的 10 行,然后 WHERE 把每一行标成留下或去掉,最后 SELECT 只留下两列。

一条查询里,子句的顺序是固定的:SELECT、FROM、WHERE。习惯上每个子句起一行,读起来清楚。

比较

条件里最常用的是这几个比较:

写法意思
=等于
<>不等于
< >小于、大于
<= >=小于等于、大于等于

注意 SQL 的「等于」只写一个 =。哪件商品卖完了?

main.sql
1SELECT name, stock2FROM products3WHERE stock = 0;
输出
namestock
台灯0
1 行

工资 4000 以上(包括 4000)的员工:

main.sql
1SELECT name, title, salary2FROM employees3WHERE salary >= 4000;
输出
nametitlesalary
李华经理6000
马超销售主管4500
杨帆仓库主管4200
3 行

小技巧: MySQL 也认 !=,意思和 <> 一样。<> 是标准写法,哪个数据库都能用。

先猜一猜

结果有几行?

1SELECT name, price2FROM products3WHERE price >= 15;

文字要加引号

数字直接写,文字(也叫字符串)要用单引号括起来。哪些订单还没发货?

main.sql
1SELECT id, customer_id, status2FROM orders3WHERE status = '待发货';
输出
idcustomer_idstatus
72待发货
91待发货
124待发货
3 行

不等于也一样。除了已发货的,还有哪些订单:

main.sql
1SELECT id, status2FROM orders3WHERE status <> '已发货';
输出
idstatus
4已取消
7待发货
9待发货
12待发货
4 行

忘了加引号,就会报错:

main.sql
1SELECT name2FROM customers3WHERE city = 上海;
输出
ERROR 1054 (42S22): Unknown column '上海' in 'where clause'

没有叫「上海」的列。「上海」如果是一段文字,要加引号:'上海'。

没有引号,数据库把 上海 当成了一个列名,表里又没有这一列,所以说「不认识 上海 这一列」。写成 '上海' 就好了。

文字要一字不差:写成 '上海市' 一行也查不到,不会报错,只是结果是空的。英文字母的大小写,MySQL 默认不区分('[email protected]' 和 '[email protected]' 算相等),别的数据库可能区分。

日期

日期也加引号,写成 '年-月-日',比如 '2025-07-01'。日期比大小就是比早晚:越晚越「大」。7 月 1 日以后注册的客户:

main.sql
1SELECT name, joined2FROM customers3WHERE joined >= '2025-07-01';
输出
namejoined
周婷2025-07-21
吴昊2025-08-30
郑雪2025-09-14
3 行

9 月 20 日以前的订单:

main.sql
1SELECT id, order_date2FROM orders3WHERE order_date < '2025-09-20';
输出
idorder_date
12025-09-02
22025-09-05
32025-09-18
3 行

条件里的列不用选出来

WHERE 用到的列,不一定要出现在 SELECT 后面。下面按分类挑商品,结果里却只显示名字:

main.sql
1SELECT name2FROM products3WHERE category = '厨房';
输出
name
水杯
咖啡杯
2 行

练一练

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

练习 1

贵的商品

查出价格高于 20 的商品,显示 name 和 price 两列。

要显示
nameprice
双肩包39.90
耳机59.00
台灯25.00
3 行
exercise1.sql
1SELECT name, price2FROM products;
输出
点「运行」或按 Ctrl+Enter
练习 2

修好它:引号

这条查询想查出北京客户的 name 和 email,可是报错了。改好它。

要显示
nameemail
王磊[email protected]
赵敏NULL
2 行
exercise2.sql
1SELECT name, email2FROM customers3WHERE city = 北京;
输出
点「运行」或按 Ctrl+Enter
练习 3

十月的订单

查出 2025 年 10 月 1 日和这一天以后的订单,显示 id 和 order_date 两列。

要显示
idorder_date
52025-10-01
62025-10-03
72025-10-10
82025-10-12
92025-10-15
102025-10-20
112025-10-22
122025-10-25
8 行
exercise3.sql
1SELECT id, order_date2FROM orders;
输出
点「运行」或按 Ctrl+Enter

这一课学会了

  • WHERE 条件 只留下条件成立的行;子句的顺序是 SELECT、FROM、WHERE。
  • 比较用 =、<>、<、>、<=、>=;等于只写一个 =。
  • 文字和日期都要加单引号;文字不加引号会被当成列名,得到 ERROR 1054。
  • 日期写成 '年-月-日',比大小就是比早晚。
  • WHERE 用的列不一定要出现在 SELECT 里。