欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql分页 & oracle分页 & sqlserver分页

程序员文章站 2022-05-17 21:46:48
...

mysql分页 & oracle分页 & sqlserver分页

分页:5变量(属性)

  1. 数据总数 (select count(*) from xxx , 查数据库)
  2. 页面大小(页面容量,每页显示的数据条数) (用户自定义)
  3. 总页数 (自动计算)
  4. 当前页码 (用户自定义)
  5. 实体类对象集合(当前页的数据集合):依赖于数据库 (查数据库)
    假设: 每页显示10条(页面大小=10)

总页数的计算:
800:10= 80页 --------------- (总页数= 数据总数 /页面大小)
802:10= 800/10 +1 ;------(总页数= 数据总数 /页面大小 + 1;)
=>通式:
总页数= 数据总数 % 页面大小==0 ?(数据总数 /页面大小):(数据总数 /页面大小 + 1);
自动计算的时机:当 数据总数 和 页面大小都被赋值以后,自动计算总页数。


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

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

假设每页显示10条数据

mysql分页:
mysql:从0开始计数

第n页 开始 结束
0 0 9
1 10 19
2 20 29
n n*10 (n+1)*10-1

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


a.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 页数*页面大小,页面大小

b.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 number >=(n-1)*10+1 and number <=n*10 ;
此种写法的前提:必须是Id连续 ,否则 无法满足每页显示10条数据

select rownum,t.*from student t where rownum >=(n-1)*10+1 and rownum <=n*10 order by number;
1.如果根据number排序则rownum会混乱
(解决方案:分开使用->先只排序,再只查询rownum)
2.rownum不能查询>的数据
mysql分页 & oracle分页 & sqlserver分页

//先只排序
select s.* from student s order by sno asc;

//再只查询rownum
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 ~ n*10
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

优化:

//eg:
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  ;	

mysql分页 & oracle分页 & sqlserver分页

c.SQLServer分页: 3种分页sql

row_number() over(字段) ;

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

select top 页面大小 * from student where id not in 
( select top (页数-1)*页面大小 id from student  order by sno asc )

2.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的区别:

  • rownum ,row_number()
  • oracle需要排序(为了排序,单独写了一个子查询),但是在sqlserver 中可以省略该排序的子查询 因为sqlserver中可以通过over直接排序

3.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开始计数
mysql分页 & oracle分页 & sqlserver分页