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