筛选与排序
WHERE过滤、比较运算、NULL值判断、ORDER BY排序
WHERE:按条件筛选
上一章学会了 SELECT ... FROM 拿数据,但每次都拿全表。现实场景通常是"查北京的所有员工"、"找工资大于 10000 的人"——这就要靠 WHERE。
基本用法
SELECT name, city FROM users WHERE city = '北京';+--------+--------+
| name | city |
+--------+--------+
| 张三 | 北京 |
| 孙七 | 北京 |
| 郑十 | 北京 |
+--------+--------+WHERE city = '北京' 的意思是:MySQL 一行行检查,city 是"北京"的留下,不是的跳过。
💡 注意字符串用单引号,
'北京'对,"北京"也能跑但不推荐(和 SQL 标准有差异)。
比较运算符
= 只是冰山一角,WHERE 支持的运算符很多:
| 运算符 | 含义 | 示例 |
|---|---|---|
= | 等于 | WHERE age = 25 |
<> 或 != | 不等于 | WHERE city <> '北京' |
< | 小于 | WHERE salary < 10000 |
<= | 小于等于 | WHERE age <= 30 |
> | 大于 | WHERE salary > 10000 |
>= | 大于等于 | WHERE age >= 28 |
BETWEEN | 在范围内 | WHERE age BETWEEN 25 AND 30 |
不等于
SELECT name, city FROM users WHERE city <> '北京';北京以外的所有人。
范围查询
SELECT name, salary FROM users WHERE salary BETWEEN 8000 AND 12000;BETWEEN a AND b 是闭区间,包含 a 和 b。上面等价于 salary >= 8000 AND salary <= 12000。
NULL 值判断
表里有些字段可能是空的——不是 0,不是 '',是 NULL。
NULL 表示"未知"或"没有值"。查 NULL 不能用 =:
-- ❌ 错误:永远查不出结果
SELECT * FROM users WHERE age = NULL;
-- ✅ 正确
SELECT * FROM users WHERE age IS NULL;同理,查非空用 IS NOT NULL:
SELECT * FROM users WHERE city IS NOT NULL;⚠️ 为什么
= NULL不行:SQL 里NULL代表"未知",一个未知值和另一个未知值无法判断相等。所以专门设计了IS NULL来判断。
ORDER BY:排序
查出来的数据默认按存储顺序排列,想按某个规则排就用 ORDER BY。
单列排序
SELECT name, salary FROM users ORDER BY salary;默认升序(ASC),工资从低到高:
+--------+----------+
| name | salary |
+--------+----------+
| 孙七 | 6000.00 |
| 郑十 | 7800.00 |
| 张三 | 8000.00 |
| ... | ... |
+--------+----------+降序加 DESC:
SELECT name, salary FROM users ORDER BY salary DESC;工资从高到低。
多列排序
先按城市排,同一城市内再按工资排:
SELECT name, city, salary FROM users ORDER BY city, salary DESC;+--------+--------+----------+
| name | city | salary |
+--------+--------+----------+
| 郑十 | 北京 | 7800.00 |
| 张三 | 北京 | 8000.00 |
| 孙七 | 北京 | 6000.00 | ← 错了?不,注意 DESC 只对 salary
+--------+--------+----------+⚠️
DESC只作用于它前面的那一列。如果 city 也要降序,得写成ORDER BY city DESC, salary DESC。
ORDER BY + LIMIT:取极值
组合这两招能解决很多实际问题。
"工资最高的 3 个人"
SELECT name, salary FROM users ORDER BY salary DESC LIMIT 3;"年龄最小的 2 个人"
SELECT name, age FROM users ORDER BY age LIMIT 2;第 4-6 名工资的人
SELECT name, salary FROM users ORDER BY salary DESC LIMIT 3, 3;📝 WHERE、ORDER BY、LIMIT 的执行顺序:WHERE 筛选 → ORDER BY 排序 → LIMIT 截取。所以
LIMIT拿到的是"筛选并排好序"之后的前 N 行。
小结
这章让查询从"全捞出来"进化到了"挑着看":
- WHERE 是筛子 — 想查谁查谁,不用全表扫描
- 比较运算符 —
=<>>BETWEEN,数字和字符串的写法不一样 - NULL 用 IS NULL / IS NOT NULL — 普通比较对 NULL 无效
- ORDER BY 排序 — 默认 ASC,DESC 是降序,可以多列排序
- ORDER BY + LIMIT 取极值 — 最高工资前 3 名、最新注册的 5 个人,都是这个组合
💡 WHERE 是 SQL 里使用频率最高的子句,把它写顺手了,后面联表、子查询才能顺滑。
自主练习
- 查所有不在北京的员工
- 查工资在 8000 到 12000 之间的人
- 查年龄大于 28 岁的员工,按年龄降序排列
- 找出工资最低的 2 个人
- 查 city 不为空的员工(数据都有 city,但试试
IS NOT NULL)