1.为什么要分页?
当太多的数据不能在一篇网页上面显示不完,我们只能显示部分数据,剩下的数据都通通放在第二页显示,如果更多的话第三页,第四页。。。。这就是分页。
2.怎么分页?
在Oracle中分页有两种方式:
1. 通过伪列来分页。
2. 通过Oracle自身提供的分析函数来分页。
什么是伪列?有哪些?怎么使用?
Oracle中的伪列是实际中不存在的列,也就是说是Oracle数据库自动提供的。每张表中都有伪列。
那么伪列分为:rownum, rowid 两种。
rowid 和 rownum的区别?
rownum 是Oracle为查询出来的数据所分配的行号。通常被用来分页。大多数都是通用rownum来分页的。
那么rowid 它是每条数据的物理地址。它是唯一的,不重复的。这个物理地址是存放在磁盘的里的,是以十六进制来展示的。
rowid在增删改查的基础上,效率很高。这也是Oracle数据库的效率之体现。
有些朋友会问到既然它是唯一的不可重复的,可以不可将它作为主键呢?
我觉得不可以,正是因为它是唯一的原因。当我们将rowid 作为主键的,在错误操作数据后,比如错误删除数据。这时候我们将备份的数据导入到表中。当其他的表在引用其主键的时候,就完全没法引用。因为新导入的数据 的rowid不与删除的rowid一样。引用完全失效了。而且,删除后的数据是可以回滚或者通过日志文件来恢复的。没有对数据所占有的磁盘空间释放。只是 做了一个标记而已。
主键是有索引的,我们可以通过查找主键。也可以很快的找到相应的数据。所以完全没有必要将rowid作为主键来使用。
rownum的使用:
查询出前三名员工?
这里是为什么呢?
因为rownum 是伪列不是真实的列。所以这样肯定是显示不出来数据的。
这时候我们可以用嵌套子查询来解决。
查询出3-8名员工?
求出按工资排序,前三名员工?
那么现在所看到的工资是按照降序排列的。但是名次是乱的。
它是先排序,然后在分配行号。
按照工资排序,求出第4到第6的员工?
rownum 很特殊,只能用<、<= ,不能用>、>=、=
rownum始终是从1开始的。
因为这里的rownum是外部的,不是内部的,而且能查询,rownum这里也是错误的,因为rownum得使用
是要加别名的。不然不能使用。
这里的rownum是伪列,不是真实的列。
这就是rownum的是使用。
接下来说说Oracle自带的分析函数row_number(),rank(),dense_rank()的使用。
row_number()函数是Oracle自带的分析函数,排列我们可以使用它。
语法:分析函数()over([partition by column] order by column[desc])
这里的partition by 是分区的意思,是将相同的分在一个区,不同的分出另外的区。分区过后还是原始记录。
order by 是以什么排序。
over 是这在。。。之上。。。 意思是在分区和排序的基础之上来进行操作数据。
求出按照工资的降序排列,求前3名员工?
求出按工作分类,求出每中工作中工资前三名员工?
名次排序:rank(), dense_rank()
1 select * from (
2 select ename,job,sal,rank() over(partition by job order by sal desc) ranking from emp)
3* where ranking <=3
SQL> /
ENAME JOB SAL RANKING
---------- --------- ---------- ----------
SCOTT ANALYST 3000 1
FORD ANALYST 3000 1
ADAMS CLERK 1300 1
MILLER CLERK 1300 1
JAMES CLERK 950 3
这里看到CLERK工作的员工中工资有两个1300的,都是排名第一,第二没有。
这种排序通常使用在比赛中。
如果要第二出现,那怎么办?
使用dense_rank(),可以完成此项功能。
1 select * from (
2 select ename,job,sal,dense_rank() over(partition by job order by sal desc) ranking from emp)
3* where ranking <=3
SQL> /
ENAME JOB SAL RANKING
---------- --------- ---------- ----------
SCOTT ANALYST 3000 1
FORD ANALYST 3000 1
ADAMS CLERK 1300 1
MILLER CLERK 1300 1
JAMES CLERK 950 2
SMITH CLERK 800 3
出处:http://hi.baidu.com/xiaoduo170/blog/item/52132be7cc0dc634b8382093.html