本文已参与「新人创作礼」活动,一起开启掘金创作之路。
分页
要实现分页 某一页 必须知道数据 从哪里开始 到哪里结束
假设 每页显示十条数据 第n页 开始 结束 1 1 10 2 11 20 3 21 30 n (n-1)10+1 n10
结论:
分页
第n页的数据 第(n-1)10+1 ------ n10
mysql从0开始计数 Oracle/sqlserver从1开始计数
mysql实现分页
limit 开始,多少条 mysql :从0开始计数 第n页 开始 结束 0 0 9 1 10 19 2 20 29 n n*10 (n+1)*10-1
第0页
select * from student limit 0,10;
第一页
select* from student limit 10,10;
第2页
select* from student limit 20,10
第n页
select* from student limit (n*10),10;
select* from student limit 页数*页面大小,页面大小;
Oracle分页
第n页 开始 结束 1 1 10 2 11 20 3 21 30 n (n-1)10+1 n10
select * from student where snow >=(n-1)*10+1 and sno<= n*10 ----此种方法存在漏洞 前提是必须id值连续
使用伪列
select rownum , t.* from student t where rownum >=(n-1)*10+1 and rownum<= n*10 order by sno;-----
order by sno 根据sno排序 如果根据sno排序 则rownum会混乱
rownum 特性: 不能查询大于的数据
解决方案
分开使用
1.先只排序
select s.* from student s order by sno asc; ---将其当成一张表
2.
select rownum t.* from(select s.* from student s order by sno asc)t where rownum >=(n-1)*10+1 and rownum<= n*10
rownum不能大于 所以我们需要把rownum变成普通列
oracle分页查询
select q.*from ( 第三步:将伪列rownum变成普通列 然后添加条件进行查询 实现分页
select rownum t.* from( 第二步:添加伪列rownum
select s.* from student s order by sno asc) t 第一步:现根据sno进行排序
)
where rownum >= (n-1)*10+1 and rownum<= n*10;
sqlserver分页查询 2005版本之后支持的
row_num() 需要制定哪一列作为row_num()进行预处理
select q.*from (
select row_num() over(sno order by sno asc) as r, * from student where r<=10*n ) where row_num() >= (n-1)*10+1 and row_num()<= n*10;
2003版本 支持top top排序
select top 页面大小 *from student where id not in (
select top (页数-1)*页面大小 id from student by sno asc; )
此种方法弊端 如果id值不连续 这不能保证 每页数据量相等
2012之后支持的
offset fetch next only
select *from student order by sno
offset (页数-1)*页面大小+1 rows fetch next 页面大小 rows only;
sql server 与oracle 的分别
1.关键字不一样
rownum row_num()
2.排序
Oracle为了排序 单独写了一个子查询
SqlServer中可以省略该排序的子查询 可以通过over()直接进行子查询