WHERE:挑出想要的行
上一课的查询每次都把表里的行全部查出来。可多数时候你只要其中一部分:便宜的商品、上海的客户、还没发货的订单。这就是 WHERE 做的事:
1SELECT name, price2FROM products3WHERE price < 10;
| name | price |
|---|---|
| 笔记本 | 4.50 |
| 中性笔(10 支) | 6.00 |
| 数据线 | 8.50 |
| 咖啡杯 | 9.90 |
10 件商品里,价格低于 10 的只有这 4 件。
WHERE 怎么挑行
WHERE 后面写一个条件。数据库拿到整张表以后,一行一行地看:条件成立,这一行留下;不成立,这一行去掉。最后才由 SELECT 挑出要显示的列。
1SELECT name, stock2FROM products3WHERE stock > 50;
| name | stock |
|---|---|
| 笔记本 | 120 |
| 中性笔(10 支) | 80 |
| 数据线 | 200 |
| 咖啡杯 | 60 |
点这段代码的单步,能看到它的每一步:先是 FROM 拿到的 10 行,然后 WHERE 把每一行标成留下或去掉,最后 SELECT 只留下两列。
一条查询里,子句的顺序是固定的:SELECT、FROM、WHERE。习惯上每个子句起一行,读起来清楚。
比较
条件里最常用的是这几个比较:
| 写法 | 意思 |
|---|---|
= | 等于 |
<> | 不等于 |
< > | 小于、大于 |
<= >= | 小于等于、大于等于 |
注意 SQL 的「等于」只写一个 =。哪件商品卖完了?
1SELECT name, stock2FROM products3WHERE stock = 0;
| name | stock |
|---|---|
| 台灯 | 0 |
工资 4000 以上(包括 4000)的员工:
1SELECT name, title, salary2FROM employees3WHERE salary >= 4000;
| name | title | salary |
|---|---|---|
| 李华 | 经理 | 6000 |
| 马超 | 销售主管 | 4500 |
| 杨帆 | 仓库主管 | 4200 |
小技巧: MySQL 也认 !=,意思和 <> 一样。<> 是标准写法,哪个数据库都能用。
结果有几行?
1SELECT name, price2FROM products3WHERE price >= 15;
价格是 39.90、59.00、25.00 和 15.00 的商品都留下了。手机壳正好 15.00,>= 包括相等,所以它也算。
文字要加引号
数字直接写,文字(也叫字符串)要用单引号括起来。哪些订单还没发货?
1SELECT id, customer_id, status2FROM orders3WHERE status = '待发货';
| id | customer_id | status |
|---|---|---|
| 7 | 2 | 待发货 |
| 9 | 1 | 待发货 |
| 12 | 4 | 待发货 |
不等于也一样。除了已发货的,还有哪些订单:
1SELECT id, status2FROM orders3WHERE status <> '已发货';
| id | status |
|---|---|
| 4 | 已取消 |
| 7 | 待发货 |
| 9 | 待发货 |
| 12 | 待发货 |
忘了加引号,就会报错:
1SELECT name2FROM customers3WHERE city = 上海;
ERROR 1054 (42S22): Unknown column '上海' in 'where clause'
没有叫「上海」的列。「上海」如果是一段文字,要加引号:'上海'。
没有引号,数据库把 上海 当成了一个列名,表里又没有这一列,所以说「不认识 上海 这一列」。写成 '上海' 就好了。
文字要一字不差:写成 '上海市' 一行也查不到,不会报错,只是结果是空的。英文字母的大小写,MySQL 默认不区分('[email protected]' 和 '[email protected]' 算相等),别的数据库可能区分。
日期
日期也加引号,写成 '年-月-日',比如 '2025-07-01'。日期比大小就是比早晚:越晚越「大」。7 月 1 日以后注册的客户:
1SELECT name, joined2FROM customers3WHERE joined >= '2025-07-01';
| name | joined |
|---|---|
| 周婷 | 2025-07-21 |
| 吴昊 | 2025-08-30 |
| 郑雪 | 2025-09-14 |
9 月 20 日以前的订单:
1SELECT id, order_date2FROM orders3WHERE order_date < '2025-09-20';
| id | order_date |
|---|---|
| 1 | 2025-09-02 |
| 2 | 2025-09-05 |
| 3 | 2025-09-18 |
条件里的列不用选出来
WHERE 用到的列,不一定要出现在 SELECT 后面。下面按分类挑商品,结果里却只显示名字:
1SELECT name2FROM products3WHERE category = '厨房';
| name |
|---|
| 水杯 |
| 咖啡杯 |
练一练
写好查询,点检查。提示随便看,实在想不出来再看答案。
贵的商品
✓查出价格高于 20 的商品,显示 name 和 price 两列。
| name | price |
|---|---|
| 双肩包 | 39.90 |
| 耳机 | 59.00 |
| 台灯 | 25.00 |
1SELECT name, price2FROM products;
修好它:引号
✓这条查询想查出北京客户的 name 和 email,可是报错了。改好它。
| name | |
|---|---|
| 王磊 | [email protected] |
| 赵敏 | NULL |
1SELECT name, email2FROM customers3WHERE city = 北京;
十月的订单
✓查出 2025 年 10 月 1 日和这一天以后的订单,显示 id 和 order_date 两列。
| id | order_date |
|---|---|
| 5 | 2025-10-01 |
| 6 | 2025-10-03 |
| 7 | 2025-10-10 |
| 8 | 2025-10-12 |
| 9 | 2025-10-15 |
| 10 | 2025-10-20 |
| 11 | 2025-10-22 |
| 12 | 2025-10-25 |
1SELECT id, order_date2FROM orders;
这一课学会了
WHERE 条件只留下条件成立的行;子句的顺序是SELECT、FROM、WHERE。- 比较用
=、<>、<、>、<=、>=;等于只写一个=。 - 文字和日期都要加单引号;文字不加引号会被当成列名,得到
ERROR 1054。 - 日期写成
'年-月-日',比大小就是比早晚。 WHERE用的列不一定要出现在SELECT里。