1,分页介绍
为什么会用到分页呢,因为有时候列表内容太多了,需要使用分页进行显示,数据过多单页面无法显示所有的内容,则每一次只显示一部分数据。
分页是一种将所有数据分段展示给用户的技术。用户每次看到的不是全部数据,而是其中的一部分,如果在其中没有找到自己想要的内容,可以通过指定页码或者翻页的方式转换可见内容,直到找到自己想要的内容为止。其实这和我们阅读书籍很类似。
实现分类的解决方案有两种
- 一次查询出数据库中的所有记录,然后在每页中显示指定的记录。
- 对数据库进行多次查询,每次只获得本页的数据并显示。
如今网站建设中的数据都是海量的,如果按照方案一执行,无疑会加大服务器内存的负载,降低系统运行速度;如果按照方案二执行,则可能会频繁操作数据库,也会影响响应效率;因此一般都会采用方案一+方案二
来是实现。
分页的可信就是计算每页多少记录和总页数以及第几页。每一页的数据则只需计算起始的记录和结束记录即可。
1.1 rownum
在oracle
中,要实现分页,需要借助rownum
这个字段,rownum
不是一个真实存在的列,它是用于从查询返回的行的编号,返回的第一行分配的是1,第二行是2,以此类推,这个伪字段可以用于限制查询返回的总行数。
【由于rownum
总是结果集的编号,所以无法直接查询rownum>1
的任何记录,因为总是从1开始的。】
这里以下表为例子:
接下来用sql
语句查询一下rownum
。
select name,age,math,rownum from student;
来看一下rownum
是怎样的。
其实每次查询的记录都自带了一个rownum
编号,只是默认不显示。
现在来进行分页操作,每一页显示5条记录,查询第一页的数据:
select rownum, name,age,math,english from student where rownum<=5;
执行这个语句的时候其实已经查询了所有的记录,只是where
限定只显示前5条数据。
注意rownum
只能小于多少,如果大于1的条件是没法获得数据的,因为每一条数据放到结果集的时候rownum
是1,第二条是2,如果第一条是1的时候不满足条件,那么第二条数据放到结果集的时候rownum
还是1,这样一直下去…
比如:
select rownum, name,age,math,english from student where rownum>2;
这里限定rownum
大于2,实际上是查不到数据的。
那么怎样获取第二页的数据呢?【5<rownum<=10
】。可以使用where
子句来实现,把查询到的数据当成数据的来源,这样rownum
就成了一个普通字段了,并不是伪列。
以上图的表为数据来源,其中rownum
这列就成了普通的一列。
select * from (select rownum, name,age,math,english from student) where rownum <=10;
这是查询前10条记录,这里有个注意的地方,where
后面的rownum
是结果集的rownum
,只能小于某个数,不能大于某个数:
那么要怎样获取表中的rownum
【结果表中普通的一列】,而不是这条语句结果集的rownum
【伪列,只能从1开始】。
这时候可以用起别名来实现:
select * from (select rownum as rw, name,age,math,english from student) where rw>5 and rw <=10;
这里起了一个别名为rw
,来实现取6到10
之间的数据,这里并没有查询结果集的rownum
,rw
是括号里面的查询语句的结果集的rownum
,这个概念不能搞混了。如下图所示:
起别名可以很好的区分不同语句结果集的rownum
。 这里注意,如果要进行排序的话,会把rownum
的序号给打乱,因为先到结果集,然后进行排序的,rownum
的序号在排序之前就已经确定了。 来看一个例子:
select rownum,rw2, name,age,math,english from (select rownum as rw2, name,age,math,english from student order by math desc);
这里对括号里面的查询结果集进行了排序操作
如上图所示,括号里面的结果集rownum
已经乱序了,但是外层的rownum
还是顺序排列的。