sql分页

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                   查数据库,分页sql

你可能感兴趣的:(JavaWeb)