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 开始,多少条
第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;
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 <=n*10 ;
--此种写法的前提:必须是Id连续 ,否则 无法满足每页显示10条数据
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不能查询>的数据
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()
2.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个变量(属性)
- 数据总数 100 103 (查数据库,
select count(*)..
) - 页面大小(每页显示的数据条数)20 (用户自定义)
- 总页数 (程序自动计算)
总页数 = 100/20 =数据总数/页面大小
总页数 = 103/20 = 数据总数/页面大小+1
—>
总页数 = 数据总数%页面大小==0? 数据总数/页面大小:数据总数/页面大小+1 ;
- 当前页(页码) (用户自定义)
- 当前页的对象集合(实体类集合):每页所显示的所有数据 (10个人信息)
List (查数据库,分页sql)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?