分页的定义
浅显理解:当在页面显示大量数据时,页面不能清楚显示大量数据时,就提供了分页这种技术,就像图书一样将大量的的内容分为许多页面,方便查看,这就是分页的浅显理解。
要实现分页,必须知道某一页的数据在哪里开始到哪里结束
假设每页显示10条数据
Sqlserver/Oracle:从1开始计数
第n页 开始 结束
1 1 10
2 11 20
3 21 30
n (n-1)10+1 n0
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 n10,10;
Mysql的分页语句
Select * from student limit 页数页面大少, 页面大少;
Oracle分页的sql
Sqlserver/Oracle:从1开始计数
第n页 开始 结束
1 1 10
2 11 20
3 21 30
n (n-1)10+1 n10
select * from student where sno >=(n-1)10+1 and sno <=n10;
此种写法的前提是:必须是Id连续,否者无法满足每页显示10条数据。
select rownum , t.from student t where sno >=(n-1)10+1 and sno <=n10;
1.如果根据sno排序则rownum会混乱
2.rownum不能查询>的数据
分三步解决:
首先先排序
Select s.*from student s order by sno asc;
再对rownun排序
select rownum , t.from
(
Select s.*from student s order by sno asc;
) t where sno >=(n-1)10+1 and sno <=n10;
解决roenum不能查询>的数据问题
Select * from
(
Select rownum r , t.from
(Select s.*from student s order by sno asc;) t
)where r >=(n-1)10+1 and r <=n10;
优化
Select * from
(
Select rownum r , t.*from
(select s.from student s order by sno asc)
where rownum<=n10
)where r>=(n-1)*10+1 and;
SQLServer分页的sql
row_number() over(字段)
三种分页查询
SQL server2003之后支持:top 此种分页SQL存在弊端(如果id值不连续,则不能保证数据量相等)
select top 页面大小 * from student where id no in
(select top (yemian -1)*页面大小 id from student order by sno asc)
SQL server2005之后支持
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;
SQL server2012之后支持
offset fetch next only
select * from student order by sno
offset (页面-1)*页面大小+1 rows fetch next 页面到校 rows only;
SQLServer此种分页sql与oralce分页sql的区别
- rownum,row_number()
- oracle需要排序(为了排序,单独写了一个子查询),但是在SQL server钟可以省略