SQL分页的实现

218 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

分页

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

假设 每页显示十条数据 第n页 开始 结束 1 1 10 2 11 20 3 21 30 n (n-1)10+1 n10

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

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

mysql实现分页

limit 开始,多少条 mysql :从0开始计数 第n页 开始 结束 0 0 9 1 10 19 2 20 29 n n*10 (n+1)*10-1

第0页

select * from student limit 0,10;

第一页

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

Oracle分页

第n页 开始 结束 1 1 10 2 11 20 3 21 30 n (n-1)10+1 n10

select * from student where snow >=(n-1*10+1 and  sno<= n*10  ----此种方法存在漏洞   前提是必须id值连续



使用伪列

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

order by sno 根据sno排序 如果根据sno排序 则rownum会混乱

rownum 特性: 不能查询大于的数据

解决方案

分开使用
1.先只排序 select s.* from student s order by sno asc; ---将其当成一张表 2.

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

rownum不能大于 所以我们需要把rownum变成普通列

oracle分页查询

select q.*from ( 第三步:将伪列rownum变成普通列 然后添加条件进行查询 实现分页

select rownum t.* from( 第二步:添加伪列rownum

select s.* from student s order by sno asc) t 第一步:现根据sno进行排序

)

where rownum >= (n-1*10+1 and  rownum<= n*10;

sqlserver分页查询 2005版本之后支持的 row_num() 需要制定哪一列作为row_num()进行预处理

select q.*from (  

select  row_num()     over(sno order by sno asc) as r,     * from    student  where r<=10*n  )  where row_num() >= (n-1*10+1 and row_num()<= n*10;

2003版本 支持top top排序

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

此种方法弊端 如果id值不连续 这不能保证 每页数据量相等

2012之后支持的

offset fetch next only
select *from student order by sno
offset  (页数-1)*页面大小+1  rows  fetch  next 页面大小  rows only

sql server 与oracle 的分别 1.关键字不一样
rownum row_num() 2.排序 Oracle为了排序 单独写了一个子查询 SqlServer中可以省略该排序的子查询 可以通过over()直接进行子查询