要实现分页,必须要知道 某一页的数据 从哪里开始 到哪里结束
假设每页显示10条数据
MySQL 分页从0开始计数,Oracle/SQL server 从1开始计数
Oracle/SQL Server :记录的index从1开始计数
第n页 开始 结束
1 1 10
2 11 20
3 21 30
n (n-1)*10+1 n*10
结论: 第n条数据:第(n-1)10+1条 ----第n10条
例如:select * form student where sno >=(n-1)*10+1 and sno<=n*10;----前提是sno列的值是连续的,没有否则无法满足显示10条数据。
- Oracle :引入伪列 rownum
select rownum ,t.* from student t where rownum>=(n-1)*10+1 and rownum<=n*10 order by sno asc ;
上述SQL语句存在问题: 1,如果根据sno排序则会导致rownum混乱(解决方案:分开使用->先排序,再选择rownum) 2,rownum不能查询>的数据(将rownum变成普通列)
具体实现:
select * form (
select rownum r , t.* from ( select s.* from student s order by sno asc ) t
) where r >=(n-1)*10+1 and r<=n*10 ;
优化:避免嵌套查询语句查询大量数据
select * form (
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 ;
- SQL server 分页查询:
SqlServer 2003支持:top
SqlServer 2005之后支持:
row_number() over(字段);
例如:
select * form (
select row_number() over(sno order by sno asc) as r, t.* from student t
where row_number()<=n*10
) where r >=(n-1)*10+1 ;
SQLserver 2012之后支持: offset fetch next only
select * from student order by sno
offset (页数-1)*页面大小+1 rows fetch next 页面大小 rows only ;
MySQL:记录的index从0开始计数
第n页 开始 结束
1 0 9
2 10 19
3 20 29
n (n-1)*10 (n-1)*10+9
mysql实现分页的SQL:
select * from table limit m,n;
其中m
是指记录开始的index,从0开始,表示第一条记录
n
是指从第m+1
条开始,取n
条。
select * from tablename limit 2,4;
即取出第3条至第6条,4条记录
例如 :
第1页 select * from student limit 0,10;
第2页 select * from student limit 10,10
第n页 select * from student limit (n-1)*10,10;
公式:limit <(页数-1)*页面大小>, <页面大小>;
分页实现:
5个变量(属性)
- 数据总数 查数据库,select count(*)
- 页面大小 每页显示的数据条数
- 总页数
总页数=数据总数%页面大小==0?数据总数/页面大小:数据总数/页面大小+1;
- 当前页(页码)
- 当前页的对象集合(实体类集合) 每页所显示的所有数据,比如10个学生信息 List
若存在错误的地方,请指出哦!