文章目录
我是一名立志把细节都说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持
我们有个学生表,里面有10个学生数据。
SELECT idx_student_name FROM student;
查询结果:
+ ---------------- +
| idx_student_name |
+ ---------------- +
| 范晓明 |
| 刘秀英 |
| 黎璐 |
| 苏云熙 |
| 雷睿 |
| 方睿 |
| 严震南 |
| 沈璐 |
| 刘岚 |
| 严宇宁 |
+ ---------------- +
通常我们直接查询出来的数据顺序是数据的插入顺序,所以并不一定是我们想要的顺序。
单列排序
我们要让数据按我们希望的方式,就需要使用到
ORDER BY
关键字。
# 格式。SELECT 列名 FROM 表名 ORDERBY 要排序的列名;
我们查询
idx_student_name
字段 从 学生表,并且让结果按照
idx_student_name
字段进行排序。
SELECT idx_student_name FROM student ORDERBY idx_student_name;
使用
ORDER BY
关键字,查询结果:
+ ---------------- +
| idx_student_name |
+ ---------------- +
| 严宇宁 |
| 严震南 |
| 刘岚 |
| 刘秀英 |
| 方睿 |
| 沈璐 |
| 苏云熙 |
| 范晓明 |
| 雷睿 |
| 黎璐 |
+ ---------------- +
多列排序
如果我们想让学生先按入学日期、再按班级排序,最后同一个班里的同学再按姓名排序,怎么处理?
SELECT
uk_student_number, admission_date, class_number, idx_student_name
FROM
student
ORDERBY
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
后面接多个字段,字段的顺序就是排序的顺序。
ORDERBY 列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
ORDERBY
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 studentORDERBY score LIMIT5;
- 查询学号、姓名、成绩、从学生表搜索,根据成绩降序(从大到小) 排列,正数前五名。 - 降序从大到小,对应成绩就是从高到低,即:正数前五名。
# 降序从大到小,对应成绩就是从高到低,即:正数前五名。SELECT uk_student_number, idx_student_name, score FROM studentORDERBY score DESCLIMIT5;
注意:
LIMIT
与
ORDER BY
联用。
LIMIT
关键字必须位于
ORDER BY
关键字之后。否则会提示语法错误,执行失败。
我是一名立志把细节都说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑 ,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持
版权归原作者 我梦Leo 所有, 如有侵权,请联系我们删除。