一、分页原因
--数据量大,需要分批次读取显示,因此需要有上一页,下一页的操作。
二、分页步骤
1.原理:要实现分页,必须知道某一页的数据从哪里开始到哪里结束。
页面大小:每页显示的数据量
2.分页
(1)mysql实现分页的sql(从0开始计数):
MYSQL实现分页的sql:
limit 开始,多少条
第0页
select * from student limit 0,10 ;
第1页
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 页数*页面大小,页面大小
(2)oracle实现分页的sql(从1开始计数):--首先和mysql不同,oracle没有limit语法,实现相对比较复杂。
下面将写出分页操作的推导过程(即为什么这样写)
a.
sqlserver/oracle:从1开始计数
第n页 开始 结束
1 1 10
2 11 20
3 21 30
n (n-1)*10+1 n*10
select *from student where sno >=(n-1)*10+1 and sno <=n*10 ;
--此种写法的前提:必须是Id连续 ,否则 无法满足每页显示10条数据
b.select rownum,t.*from student t where rownum >=(n-1)*10+1 and rownum <=n*10 order by sno;
--1.如果根据sno排序则rownum会混乱(解决方案:分开使用->先只排序,再只查询rownum)
--2.但是rownum不能查询>的数据
c.采用子查询的方法解决了此种问题,有关rownum使用方法参考我另一篇文章
select s.* from student s order by sno asc;
select rownum, t.* from
(select s.* from student s order by sno asc) t
where rownum >=(n-1)*10+1 and rownum <=n*10 ;
select *from
(
select rownum r, t.* from
(select s.* from student s order by sno asc) t
)
where r>=(n-1)*10+1 and <=n*10 ;
(3) sqlserver实现分页的sql(从1开始计数):
a.
row_number() over(字段) ;
select *from
(
select row_number() over (sno order by sno asc) as r,* from student
where r<=n*10
)
where r>=(n-1)*10+1 and ;
b.
sqlserver2003:top --此种分页SQL存在弊端(如果id值不连续,则不能保证每页数据量相等)
select top 页面大小 * from student where id not in
( select top (页数-1)*页面大小 id from student order by sno asc )
c.
sqlserver2005之后支持:
offset fetch next only
select * from student oreder by sno
offset (页数-1)*页面大小+1 rows fetch next 页面大小 rows only ;
SQLServer此种分页sql与oralce分页sql的区别:
1.rownum ,row_number() 名称上的差别
2.oracle需要排序(为了排序,单独写了一个子查询),但是在sqlserver 中可以省略该排序的子查询 因为sqlserver中可以通过over直接排序