oracle数据库:分页 rownum

1,分页介绍

为什么会用到分页呢,因为有时候列表内容太多了,需要使用分页进行显示,数据过多单页面无法显示所有的内容,则每一次只显示一部分数据。
分页是一种将所有数据分段展示给用户的技术。用户每次看到的不是全部数据,而是其中的一部分,如果在其中没有找到自己想要的内容,可以通过指定页码或者翻页的方式转换可见内容,直到找到自己想要的内容为止。其实这和我们阅读书籍很类似。

实现分类的解决方案有两种

  1. 一次查询出数据库中的所有记录,然后在每页中显示指定的记录。
  2. 对数据库进行多次查询,每次只获得本页的数据并显示。

如今网站建设中的数据都是海量的,如果按照方案一执行,无疑会加大服务器内存的负载,降低系统运行速度;如果按照方案二执行,则可能会频繁操作数据库,也会影响响应效率;因此一般都会采用方案一+方案二来是实现。
分页的可信就是计算每页多少记录和总页数以及第几页。每一页的数据则只需计算起始的记录和结束记录即可。

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之间的数据,这里并没有查询结果集的rownumrw是括号里面的查询语句的结果集的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还是顺序排列的。

猜你喜欢

转载自blog.csdn.net/will__be/article/details/117510825