文章目录
- 单列排序
- 多列排序
- 指定排序方式,升序(ASC,ASCENDING) / 降序(DESC,DESCENDING)
- `ORDER BY` 关键字与 `LIMIT` 关键字联用
我是一名立志把细节都说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持
我们有个学生表,里面有10个学生数据。
SELECT idx_student_name FROM student;
查询结果:
+ ---------------- + | idx_student_name | + ---------------- + | 范晓明 | | 刘秀英 | | 黎璐 | | 苏云熙 | | 雷睿 | | 方睿 | | 严震南 | | 沈璐 | | 刘岚 | | 严宇宁 | + ---------------- +
通常我们直接查询出来的数据顺序是数据的插入顺序,所以并不一定是我们想要的顺序。
单列排序
我们要让数据按我们希望的方式,就需要使用到 ORDER BY 关键字。
# 格式。 SELECT 列名 FROM 表名 ORDER BY 要排序的列名;
我们查询 idx_student_name 字段 从 学生表,并且让结果按照 idx_student_name 字段进行排序。
SELECT idx_student_name FROM student ORDER BY idx_student_name;
使用 ORDER BY 关键字,查询结果:
+ ---------------- + | idx_student_name | + ---------------- + | 严宇宁 | | 严震南 | | 刘岚 | | 刘秀英 | | 方睿 | | 沈璐 | | 苏云熙 | | 范晓明 | | 雷睿 | | 黎璐 | + ---------------- +
多列排序
如果我们想让学生先按入学日期、再按班级排序,最后同一个班里的同学再按姓名排序,怎么处理?
SELECT uk_student_number, admission_date, class_number, idx_student_name FROM student ORDER BY admission_date, class_number, idx_student_name;
查询结果:
+ ----------------- + -------------- + ----------- + ---------------- + | uk_student_number | admission_date | class_number| idx_student_name | + ----------------- + -------------- + ----------- + ---------------- + | 89480 | 2023-09-01 | 1991 | 严宇宁 | | 21666 | 2023-09-01 | 1991 | 严震南 | | 39917 | 2023-09-01 | 2582 | 刘岚 | | 17117 | 2023-09-01 | 2582 | 刘秀英 | | 46573 | 2023-09-01 | 2582 | 黎璐 | | 52626 | 2023-09-01 | 5075 | 沈璐 | | 28909 | 2023-09-01 | 5436 | 方睿 | | 41955 | 2023-09-01 | 5436 | 范晓明 | | 48262 | 2023-09-01 | 5436 | 雷睿 | | 60631 | 2023-09-01 | 5441 | 苏云熙 | + ----------------- + -------------- + ----------- + ---------------- +
我们可以很清晰的看见:
- 学生号是乱序的,所以学生号没有影响排列。
- 先筛选了同一天入学的数据。
- 然后再按同一个班级的排序。
- 最后同一个班级的再按名称排序。
小结:
ORDER BY 后面接多个字段,字段的顺序就是排序的顺序。
ORDER BY 列1, 列2, 列3;
- 先按列1排序。
- 同一列1里面,再按列2排序。
- 同一列1,列2,里面,再按列3排序。
指定排序方式,升序(ASC,ASCENDING) / 降序(DESC,DESCENDING)
- 不指定列的排序方式,默认是升序ASC。
- 降序排序需要在列名后标出DESC(升序不标默认也是升序,所以重点关注降序即可)。
- 降序标一列DESC,此一列按降序排列;标两列DESC,此两列按降序排列;没有标的列,仍然默认按升序排列。
我们将 idx_student_name 字段单独加上DESC,现在的逻辑变成:
- 先依次按入学日期(admission_date)、班级(class_number )字段升序排列。
- 最后同一个班级的数据,按名(idx_student_name)称倒序排列。
SELECT uk_student_number, admission_date, class_number, idx_student_name FROM student ORDER BY admission_date, class_number, idx_student_name DESC;
查询结果:
+ ----------------- + -------------- + ----------- + ---------------- + | uk_student_number | admission_date | class_number| idx_student_name | + ----------------- + -------------- + ----------- + ---------------- + | 21666 | 2023-09-01 | 1991 | 严震南 | | 89480 | 2023-09-01 | 1991 | 严宇宁 | | 46573 | 2023-09-01 | 2582 | 黎璐 | | 17117 | 2023-09-01 | 2582 | 刘秀英 | | 39917 | 2023-09-01 | 2582 | 刘岚 | | 52626 | 2023-09-01 | 5075 | 沈璐 | | 41955 | 2023-09-01 | 5436 | 范晓明 | | 48262 | 2023-09-01 | 5436 | 雷睿 | | 28909 | 2023-09-01 | 5436 | 方睿 | | 60631 | 2023-09-01 | 5441 | 苏云熙 | + ----------------- + -------------- + ----------- + ---------------- +
排序区分大小写问题:
- 这个主要看数据库和表的编码方式上有没有区分大小写。
- 例如我这里使用的测试数据 utf8mb4_0900_ai_ci 的编码方式,就是不区分大小写的。
- _ci 表示不区分大小写(ci = case insensitive)。
- _cs 表示区分大小写(cs = case sensitive)。
ORDER BY 关键字与 LIMIT 关键字联用
我们使用 ORDER BY 与 LIMIT 联用,可以很方便的实现,班级按成绩排名。(假设只有一个班级,仅演示当前功能,不牵涉过多搜索关键字)
- 查询学号、姓名、成绩、从学生表搜索,根据成绩升序(默认升序,从小到大) 排列,倒数前五名。
- 默认升序从小到大,对应成绩就是从低到高,即:倒数前五名。
# 默认升序从小到到,对应成绩就是从低到高,即:倒数前五名。 SELECT uk_student_number, idx_student_name, score FROM student ORDER BY score LIMIT 5;
- 查询学号、姓名、成绩、从学生表搜索,根据成绩降序(从大到小) 排列,正数前五名。
- 降序从大到小,对应成绩就是从高到低,即:正数前五名。
# 降序从大到小,对应成绩就是从高到低,即:正数前五名。 SELECT uk_student_number, idx_student_name, score FROM student ORDER BY score DESC LIMIT 5;
注意:
LIMIT 与 ORDER BY 联用。LIMIT 关键字必须位于 ORDER BY 关键字之后。否则会提示语法错误,执行失败。
我是一名立志把细节都说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑 ,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持
- 降序从大到小,对应成绩就是从高到低,即:正数前五名。
- 默认升序从小到大,对应成绩就是从低到高,即:倒数前五名。
- 查询学号、姓名、成绩、从学生表搜索,根据成绩升序(默认升序,从小到大) 排列,倒数前五名。
还没有评论,来说两句吧...