Skip to content

筛选与排序

WHERE过滤、比较运算、NULL值判断、ORDER BY排序

WHERE:按条件筛选

上一章学会了 SELECT ... FROM 拿数据,但每次都拿全表。现实场景通常是"查北京的所有员工"、"找工资大于 10000 的人"——这就要靠 WHERE

基本用法

sql
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

不等于

sql
SELECT name, city FROM users WHERE city <> '北京';

北京以外的所有人。

范围查询

sql
SELECT name, salary FROM users WHERE salary BETWEEN 8000 AND 12000;

BETWEEN a AND b闭区间,包含 ab。上面等价于 salary >= 8000 AND salary <= 12000

NULL 值判断

表里有些字段可能是空的——不是 0,不是 '',是 NULL

NULL 表示"未知"或"没有值"。查 NULL 不能用 =

sql
-- ❌ 错误:永远查不出结果
SELECT * FROM users WHERE age = NULL;

-- ✅ 正确
SELECT * FROM users WHERE age IS NULL;

同理,查非空用 IS NOT NULL

sql
SELECT * FROM users WHERE city IS NOT NULL;

⚠️ 为什么 = NULL 不行:SQL 里 NULL 代表"未知",一个未知值和另一个未知值无法判断相等。所以专门设计了 IS NULL 来判断。

ORDER BY:排序

查出来的数据默认按存储顺序排列,想按某个规则排就用 ORDER BY

单列排序

sql
SELECT name, salary FROM users ORDER BY salary;

默认升序(ASC),工资从低到高:

+--------+----------+
| name   | salary   |
+--------+----------+
| 孙七   |  6000.00 |
| 郑十   |  7800.00 |
| 张三   |  8000.00 |
| ...    |      ... |
+--------+----------+

降序加 DESC

sql
SELECT name, salary FROM users ORDER BY salary DESC;

工资从高到低。

多列排序

先按城市排,同一城市内再按工资排:

sql
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 个人"

sql
SELECT name, salary FROM users ORDER BY salary DESC LIMIT 3;

"年龄最小的 2 个人"

sql
SELECT name, age FROM users ORDER BY age LIMIT 2;

第 4-6 名工资的人

sql
SELECT name, salary FROM users ORDER BY salary DESC LIMIT 3, 3;

📝 WHERE、ORDER BY、LIMIT 的执行顺序:WHERE 筛选 → ORDER BY 排序 → LIMIT 截取。所以 LIMIT 拿到的是"筛选并排好序"之后的前 N 行。

小结

这章让查询从"全捞出来"进化到了"挑着看":

  1. WHERE 是筛子 — 想查谁查谁,不用全表扫描
  2. 比较运算符= <> > BETWEEN,数字和字符串的写法不一样
  3. NULL 用 IS NULL / IS NOT NULL — 普通比较对 NULL 无效
  4. ORDER BY 排序 — 默认 ASC,DESC 是降序,可以多列排序
  5. ORDER BY + LIMIT 取极值 — 最高工资前 3 名、最新注册的 5 个人,都是这个组合

💡 WHERE 是 SQL 里使用频率最高的子句,把它写顺手了,后面联表、子查询才能顺滑。

自主练习

  1. 查所有不在北京的员工
  2. 查工资在 8000 到 12000 之间的人
  3. 查年龄大于 28 岁的员工,按年龄降序排列
  4. 找出工资最低的 2 个人
  5. 查 city 不为空的员工(数据都有 city,但试试 IS NOT NULL

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8