您的位置:首页 > 数据库

【数据库】分页SQL操作

2019-04-11 00:06 99 查看

一、分页原因

--数据量大,需要分批次读取显示,因此需要有上一页,下一页的操作。

 

二、分页步骤

1.原理:要实现分页,必须知道某一页的数据从哪里开始到哪里结束。

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

2.分页

(1)mysql实现分页的sql(从0开始计数):

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

...

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

(2)oracle实现分页的sql(从1开始计数):--首先和mysql不同,oracle没有limit语法,实现相对比较复杂。

下面将写出分页操作的推导过程(即为什么这样写)

 

a.

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条数据

b.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不能查询>的数据 

c.采用子查询的方法解决了此种问题,有关rownum使用方法参考我另一篇文章

【oracle】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 ; 

select *from 
(
    select rownum r, t.* from
    (select s.* from student s order by sno asc) t         
)
where r>=(n-1)*10+1 and <=n*10  ;           

(3)  sqlserver实现分页的sql(从1开始计数):

a.

row_number()    over(字段) ;

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  ;    

b.

sqlserver2003:top  --此种分页SQL存在弊端(如果id值不连续,则不能保证每页数据量相等)
select top 页面大小 * from student where id not in 
( select top (页数-1)*页面大小 id from student  order by sno asc )

c.

sqlserver2005之后支持:
offset fetch next only
select * from student  oreder by sno 
offset (页数-1)*页面大小+1  rows fetch next 页面大小  rows only ;

SQLServer此种分页sql与oralce分页sql的区别:

1.rownum  ,row_number()   名称上的差别

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: