学习目标:
1、掌握数据库分页算法
2、掌握不同数据库之间分页算法的不同点
学习过程:
今天的另外一个重要内容就是分页显示列表。现在我们在页面上面看到的用户列表都是全部信息,信息量少当然没有问题,但是一般数据里都会几百或者上万条,每次都全部显示是不可能的,所以我们必须分页显示。
分页一般有两种实现方式,其一、先把所有的信息查询出来保存在web服务器中,然后在展示的时候再部分展示。其二、在数据库就做好分页查询,然后展示就只会展示到查询出来的结果。第一种方法对数据库压力比较少,不用每次分页都查询数据库,但是不适合数据量很大的时候,因为一次查询上万数据保存在web服务器中不现实。所以一般我们会使用第二种方式。当然也有一些结合这两种方式的分页,先查询几页的数据,如果需要查询后面的数据时再查询数据库,这样当然是最高效的方法。这里我们学习的是第二种方式,就是先从数据库开始分页查询数据。
麻烦的是不同的数据库的分页查询是不同的,所以我们必须分开进行学习
一、mysql的分页算法
mysql的分页算法最简单,就是使用limit关键字即可。
Mysql的分页sql使用在sql语句末端 + limit (起始位置),查询的数量,
如:select * from table where ... limit 起始位置,查询的数量(pageSize);
比如我们查询前10条的数据,如下面所示:
select * from tb_user limit 0,10
二、sql servlet的分页算法
sql server的分页算法也比较简单,示例如下:
1、分页方案一:(利用Not In和SELECT TOP分页)
如: select top 页大小[pagesize] * from table where ( id not in(select top 页大小*当前页数 id from table order by id)) order by id。
2、 分页方案二:(利用ID大于多少和SELECT TOP分页)
select top 页大小[pagesize] * from table where (id >(select max(id) from (select top 页大小*当前页数 id from table order by id) as t)) order by id。
三、oracle的分页算法
oracle分页算法最为复杂,实现方法也很多
1、按ROWNUM来分【三层】
select * from(select t.*,rownum rn from(select * from 【table】 order by 【id】 desc) t where rownum<=10) where rn>0
10是终止位,0起始位,rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2。
2、按分析函数来分【两层】
select * from (select t.*,row_number() over(order by cid desc) rk from 【table】t) where rk<10000 and rk>9980;
3、根据ROWID来分【四层】
select * from 【table】where rowid in(select rid from (select rownum rn,rid from(select rowid rid,cid from 【table】order by cid desc) where rownum<10000) where rn>9980) order by cid desc;
rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行。 利用rowid是访问表中一行的最快方式。
比如使用oracle实现对tb_user的分页查询
select * from(select t.*,rownum rn from(select * from tb_user ) t where rownum<=10) where rn>0