1、 分页
要实现分页 必须知道 某一页 数据从哪儿开始 到哪儿结束
假设每页10条数据
sqlserver/oracle: 从1开始
第n页 开始 结束
1 1 10
2 11 20
3 21 30
n 10*(n-1)+1 n*10
mysql :第0开始
第n页 开始 结束
1 0 9
2 10 19
3 20 29
n 10*(n-1) n*10-1
mysql :实现分页的sql
limit: 开始 ,多少条数据
第n页
select * from student limit 页面大小*页数,页面大小
oracle实现分页
1、
select * from student where sno>=(n-1)*10 + 1 and sno<=n*10 : 此种写法必须是ID必须是连续的
select rownum ,t.* from student where sno>=(n-1)*10 + 1 and sno<=n*10 order by t.sno asc :
1、如果根据sno排序,则rownum会乱序(解决办法: 分开使用,先之排序,然后使用rownum排序)
2、rownum不能查询 > 的数据
select rownum, t.* from (select s.*from student s order by sno asc) t; ----排序
---使用:
select * from (
select rownum r, t.* from (select s.*from student s order by sno asc) t
where rownum <= n*10;
)
where r >=(n-1)*10+1 ;
sqlserver2003:top
select top 3(页面大小) * from student
where sno not in (select top (n-1)*3(页数-1)*(页面大小)
from student order by sno asc )
sqlserver分页 2005之后支持
row_number() over(字段)
select * from(
select row_number() over( sno order by sno asc ) as r ,* from student //将sno添加 伪序
where r <= n*10
)
where row_number>=(n-1 )*10;
sqlserver 2012之后支持
offset fetch next only
select * from student oreder by sno
offset (页数 - 1)*页面大小+1 rows fetch next 页面大小 rows noly;
sqlserver 与MySQL和oralce 分页的区别:
1、 rownum , row_number()
2、 oracle需要排序(为了排序,单独写了个子查询)但是SqlServer中可以省略排序的子查询 因为sqlserver中可以通过over() 直接排序
分页实现:
可以使用一个单独的类进行封装
5个变量(属性)
1、 数据总数 (查数据库 select count(*)... )
2、 页面大小(每页显示数据的条数) (用户自定义)
3、 总页数 (程序自动计算)(总页数=数据总数%页面大小==0?数据总数/页面大小:数据总数/页面大小+1)
4、 当前页(页码)
5、 当前页的对象集合(实体类集合):每页所显示的所有数据
List<Xxx> 查数据库,分页sql