📄 一句话概括
ORDER BY 给查询结果排队——ASC 升序(默认)、DESC 降序,还能多列接力排。
📝 本节和前面几节的关系
查询主线进展:会竖切(3-7)、会横切(3-8~3-10)、会增删改(3-6/3-11/3-12);本节起给结果【加服务】——先排队,再限量(3-14),然后上函数算总账。
一、升降序两个词
2-2 说过【表里的记录不分先后】——要顺序,查询时用 ORDER BY 现排:
-- 准备块(没建表先跑 3-6 的准备块)
-- 按分数从低到高(ASC 升序,可省略不写)
SELECT * FROM students ORDER BY score ASC;
-- 按分数从高到低(DESC 降序,排行榜全靠它)
SELECT * FROM students ORDER BY score DESC;
| 词 | 意思 | 记法 |
|---|---|---|
| ASC | 升序(小→大) | ascending,默认值 |
| DESC | 降序(大→小) | descending,排行榜/最新优先 |
二、多列接力排
先按班级、同班内再按分数从高到低:
SELECT * FROM students ORDER BY class ASC, score DESC;
规则:先按第一列分块排,块内相同者再按第二列排——像运动会【先按年级排、同年级按成绩排】。
三、ORDER BY 在语句里的位置
一条查询的固定词序:SELECT → FROM → WHERE → ORDER BY。
SELECT name, score
FROM students
WHERE class = 1
ORDER BY score DESC;
——先筛出 1 班(WHERE),再把结果排队(ORDER BY)。先筛后排,词序写错 DBMS 直接报语法错。
四、动手 Demo:排行榜三连
-- ① 全班分数榜(降序)
SELECT name, score FROM students ORDER BY score DESC;
-- ② 按班级分块、块内分数降序
SELECT name, class, score FROM students ORDER BY class ASC, score DESC;
-- ③ WHERE + ORDER BY 组合:2 班的成绩榜
SELECT name, score FROM students WHERE class = 2 ORDER BY score DESC;
②的输出:
name class score
李四 1 92
张三 1 85
王五 2 78
赵六 2 64
钱七 3 <空>
注意钱七排最后——NULL 在排序里被当作最小(升序排最前、降序排最后,SQLite 口径;不同 DBMS 略有差异)。看到什么算成功:①92 打头、②块内有序、③只剩王五赵六。
五、30 秒实验
给文本列排序:SELECT name FROM students ORDER BY name DESC;——文字按字典序倒着排。再试 ORDER BY 1(按第 1 个输出列排)——能跑,但别用:列一换顺序就错排,正式代码永远写列名。
六、常见误区
- "表里的数据本来就有顺序" —— 没有。不写 ORDER BY 的查询顺序无保证;要顺序必须自己排。
- "ASC 可写可不写,DESC 也一样" —— ASC 确实是默认,但写明更好——读的人不用猜你想要哪种。
- "ORDER BY 写在 WHERE 前面" —— 词序固定【WHERE 在前】;顺序错了是语法错误。
自测三问(点开对答案)
1. 升序降序的关键词?谁是默认? **ASC 升序(默认)、DESC 降序**。 2. 多列排序的规则? **先按第一列排,相同者再按第二列接力**。 3. 一条查询的固定词序? **SELECT → FROM → WHERE → ORDER BY**——先筛后排。- ☐ 下一节(3-14 LIMIT、OFFSET-指定需要获取的记录数量)
相关笔记
- DELETE-删除记录 —— 操作家族刚收尾,本节回到查询加服务
- 🗄️ 数据库基础 · 索引 —— 全课路线图