第8篇:排序和分页(ORDER BY & LIMIT )
本章内容
1. 详解排序查询
2. 详解limit
3. limit存在的坑
4. 分页查询中的坑
排序查询
MySQL在检索数据时所检索到的数据展示出来的数据顺序是按照其底层数据存储顺序展示的(MySQL底层的的数据结构是用B+树实现的,B+树是一个有序结构)。但是由于数据增删操作,这种顺序会受到MySQL重用回收存储空间的影响,这种影响是不可预测的。因此在关系型数据库设计理论中认为,若不明确规定排序顺序,则不应该假定检索出的数据顺序有意义
子句:SQL语句由子句构成,有些句子是必须的,如FROM语句,而有些语句则是可选的,如LIMIT和DICTINCT语句。
排序用ORDER BY语句
SELECT 字段名 FROM 数据表 ORDER BY 字段名
SELECT aname FROM account ORDER BY aname
按照字母排序
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jquDZ5MK-1625475535992)(https://ae02.alicdn.com/kf/H202159fb1b74427381b56ed8335d022a0.jpg)]
按多个列排序
select 字段名 from 表名 order by 字段1 [asc|desc],字段2 [asc|desc];
asc|desc表⽰排序的规则,asc:升序,desc:降序,默认为asc;
SELECT aname,apass FROM account ORDER BY aname,apass
按照多个列排序,先按照aname排序,当aname一样时,按照apass排序
指定排序方向
ORDER BY指令在默认是进行升序排列,降序排列需要DESC指令指定
SELECT aname,apass FROM account ORDER BY aname DESC;
指定使用aname单行进行排列,排列方式是Z-A降序排列
若想对多列指定排序方向
SELECT aname,apass FROM account ORDER BY aname,apass DESC;
DESC关键字只能应用到其之前的一个列名,并不能覆盖到其他列,所以上述语句中apass进行降序排列,但是aname还是使用升序排列,若要对每一列都进行降序排列,就需要对每个列明都用DESC关键字进行修饰
ASC是与DESC相对应的关键字,由它修饰的列会进行升序排列,但是ASC其实没什么用处,因为升序排列是ORDER BY关键字默认的
使用ORDER BY 和LIMIT关键字可以找出最高或最低值
找出最大值
SELECT aname,apass
FROM account
ORDER BY apass DESC
LIMIT 1;
找出最小值
SELECT aname,apass
FROM account
ORDER BY apass
LIMIT 1;
ORDER BY子句应该位于FROM字句之后,LIMIT必须位于ORDER BY之后
按函数排序
LIMIT介绍
LIMIT用来限制SELECT查询返回的行数,常用于分页操作
LIMIT关键字可以限制返回行的行数以及起始行数
SELECT 字段名 FROM 数据表 LIMIT 5;
返回前五行
SELECT 字段名 FROM 数据表 LIMIT 4,5;
以上语句可以用SELECT 字段名 数据表 LIMIT 5 OFFSET 4;代替
返回从第4行开始的接着的5行;
注意:如果LIMIT的行数大于最大行数,则只返回有的行数
从0开始检索
获取排名第n到m的记录
我们需要先跳过n-1条记录,然后取m-n+1条记录,如下:
select 列 from 表 limit n-1,m-n+1;
分页查询
开发过程中,分页我们经常使⽤,分页⼀般有2个参数:
page:表⽰第⼏页,从1开始,范围[1,+∞)
pageSize:每页显⽰多少条记录,范围[1,+∞)
如:page = 2,pageSize = 10,表⽰获取第2页10条数据。
我们使⽤limit实现分页,语法如下:
select 列 from 表名 limit (page - 1) * pageSize,pageSize;
结论:limit后⾯只能够跟明确的数字。
总结
• order by ... [asc|desc]⽤于对查询结果排序,asc:升序,desc:降序,asc|desc可以省
略,默认为asc
• limit⽤来限制查询结果返回的⾏数,有2个参数(offset,count),offset:表⽰跳过
多少⾏,count:表⽰跳过offset⾏之后取count⾏
• limit中offset可以省略,默认值为0
• limit中offset 和 count都必须⼤于等于0
• limit中offset和count的值不能⽤表达式
• 分页排序时,排序不要有⼆义性,⼆义性情况下可能会导致分页结果乱序,可以在后⾯追加⼀个主键排序