JavaWeb - 分页补充

分页

  • 要实现分页,必须知道 某一页的 数据 从哪里开始 到哪里结束

  • 页面大小:每页显示的数据量

假设每页显示10条数据

mysql分页:

mysql:从0开始计数

0 0 9
1 10 19
2 20 29
n n*10 (n+1)*10-1

结论:
分页:
第n页的数据: 第(n-1)10+1条 – 第n10条

MYSQL实现分页的sql:

limit 开始,多少条

  1. 第0页
    select * from student limit 0,10 ;
  2. 第1页
    select * from student limit 10,10 ;
  3. 第2页
    select * from student limit 20,10 ;
  4. 第n页
    select * from student limit n*10,10

mysql的分页语句:

select * from student limit 页数*页面大小,页面大小

oracle分页:

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 <=n10 ; --此种写法的前提:必须是Id连续 ,否则 无法满足每页显示10条数据

select rownum,t.*from student t where rownum >=(n-1)*10+1 and rownum <=n*10  order by sno;
  • 如果根据sno排序则rownum会混乱(解决方案:分开使用->先只排序,再只查询rownum) 2.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  ;
  • ORACLE\sqlserver都是从1开始计数: (n-1)10+1 — n10
    oracle的分页查询语句:
select *from 
(
	select rownum r, t.* from
	(select s.* from student s order by sno asc) t 		10000
)
where r>=(n-1)*10+1 and <=n*10  ;				10

优化:

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  ;	
select *from 
(
	select rownum r, t.* from
	(select s.* from student s order by sno asc) t 		
	where  rownum<=页数*页面大小 
)
where r>=(页数-1)*页面大小+1  ;	
  • SQLServer分页: 3种分页sql
    row_number() over(字段) ;

  • sqlserver2003:top --此种分页SQL存在弊端(如果id值不连续,则不能保证每页数据量相等)

select top 页面大小 * from student where id not in 
( select top (页数-1)*页面大小 id from student  order by sno asc )
  • sqlserver2005之后支持:
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  ;	

SQLServer此种分页sql与oralce分页sql的区别: 1.rownum ,row_number()

  1. oracle需要排序(为了排序,单独写了一个子查询),但是在sqlserver 中可以省略该排序的子查询 因为sqlserver中可以通过over直接排序
  • sqlserver2012之后支持:
offset fetch next only
select * from student  oreder by sno 
offset (页数-1)*页面大小+1  rows fetch next 页面大小  rows only ;

(n-1)10+1 — n10

mysql从0开始计数,Oracle/sqlserver 从1开始计数

1
2
3
4
6
8
9
10

11
12

20

21
22

31

分页实现:
5个变量(属性)

  1. 数据总数 100 103 (查数据库,select count(*)..
  2. 页面大小(每页显示的数据条数)20 (用户自定义)
  3. 总页数 (程序自动计算
    • 总页数 = 100/20 =数据总数/页面大小
    • 总页数 = 103/20 = 数据总数/页面大小+1
总页数 = (数据总数%页面大小) == 0 ? 数据总数/页面大小 : 数据总数/页面大小+1 ;
  1. 当前页(页码) (用户自定义
  2. 当前页的对象集合(实体类集合):每页所显示的所有数据 (10个人信息)
    List (查数据库,分页sql)
发布了41 篇原创文章 · 获赞 1 · 访问量 564

猜你喜欢

转载自blog.csdn.net/qq_41620020/article/details/104935493
今日推荐