Oracle的分页是不同于MySQL的,今天我们来讨论一下Oracle的分页,首先得知道两个概念
rowid和rownum
什么鬼?有鸟用啊?
我们从字面的英文翻译可以知道rowid是 “行id”,rownum是“行数字”
rowid是记录在创建的时候生成的,而且是不变的,直接指向硬件上的存储位置
我们可以在SQL Develop中选中一张表,右键 Edit data,就可以看到这么 一张表,这里依旧是使用scott自带的emp表演示:
可以看到每条记录都有一个rowid
我们可以这样使用rowid来查询
效率是最高的,但是rowid是由Oracle维护,程序猿无法做到。
rownum“行的数”,它是一个伪列,查询的时候,除非特别指定,否则不会显示,表示行号,常用于控制返回的行号。
说白了,伪列,要是记不住它可以把它当作“假冒伪劣产品",用来表示查询的记录是在第几行的,如下:
说了,这么多,这个“假冒伪劣产品”伪列有什么鸟用啊?
我们看,我们已经知道第几行什么元素,我们是不是就可以分页了
我们按照工资的大到小排序先:
嗯~ o(* ̄▽ ̄*)o? what?怎么伪列的顺序被打乱了,这还排个毛啊!!!!
由此我们也可以看出来,当 rownum 和 order by 一起使用时,会首先选出符合 rownum
条件的记录,然后再进行排序.,就是我们上面图片出现的情况↑ ↑ ↑
因此, 需要用子查询来完成.
好了,我们现在显示一下工资从大到小前5条的记录
接着,我们想要看一下,6——10的记录,怎么办呢?
what????什么鬼,没有???
由于先要进行 where 条件判断, 满足条件后才能生成
rownum, 所以导致 rownum 无法进行大于(>)和大于等于(>=)
的判断. 此时, 需要使用嵌套子查询来实现
也就是再把它当作一张表,我们再查找
那么问题来了,有没有什么规律呢?当传入一个page(当前页数),size(每页显示的记录数),我们该怎么表示呢?