SQL分页查询

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

假设每页显示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*10where  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*10where  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个变量(属性)

  1. 数据总数 查数据库,select count(*)
  2. 页面大小 每页显示的数据条数
  3. 总页数
总页数=数据总数%页面大小==0?数据总数/页面大小:数据总数/页面大小+1;
  1. 当前页(页码)
  2. 当前页的对象集合(实体类集合) 每页所显示的所有数据,比如10个学生信息 List

若存在错误的地方,请指出哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值