这是啥?
Oracle
数据库为了实现完整的关系数据库功能,自动帮助用户创建了许多伪列;
除了默认伪列
nextval
,
cu
rrval
;还有两个重要伪列
rownum,rowid;
而
dual
属于伪表
;
ROWID伪列
数据表保存的每一行记录,
Oracle
都会默认为每条记录分配一个唯一的地址编号,改编号是通过
rowid
表示的;所有的数据都利用它进行定位;
ROWID
可以定位一个数据中的任何数据行。因为一个段只能存放在一个表空间内,通过使用数据对象号,
Oracle
就可以找到包含数据行的表空间;之后使用表空间中的相对文件号就可以确定文件,再利用数据块号就可以确定包含所需数据行的数据块,最后使用行号就可以定位数据行的行目录项;
示例:观察ROWID的存在
SELECT ROWID,deptno,dname,loc FROM dept ;
ROWNUM伪列
此伪列表示的是一个数据行编号的伪列,它的内容是在用户查询数据的时候,为用户动态分配一个数字(行号);
示例:通过
rownum
查看行号
SELECT ROWNUM,empno,ename,job,sal,hiredate FROM emp ;
效果:每条数据前都加上了一个行号,可以发现,这些行号是顺序排列的
常用操作:
操作
1
:取出一个查询的第一行记录;
操作
2
:取出一个查询的前
N
行记录;
举个栗子:
示例
1
:查询emp表中的第一行雇员信息
注意:第一种操作
SELECT * FROM emp WHERE ROWNUM=1 ;
示例
2
:取出一个查询的前
N
行记录,这种操作常用于分页;
分页操作实际上由两个部分组成:
数据显示部分:主要是从数据表中选出指定的部分数据,需要
ROWNUM
伪列才可以完成;
分页控制部分:留给用户的控制端,用户只需要选择指定的页数,应用程序就会根据用户的选择,列出指定的部分数据;
语法:
select * from ( select 列1[,列2,....], ROWNUM rownum 别名
from 表名称 [别名]
where rownum <=(currentPage (当前所在页) * lineSize (每页显示记录行数))
) temp
where temp.rownum 别名>(currentPage (当前所在页) -1) * lineSize(每页显示记录行数);
如果要实现前N行查询,就一定需要依靠子查询,此语法的作用原理如下图:
通过上图,如果想显示
6~10
条记录,首先要通过子查询查询出前
10
条记录,之后再使用子查询中生成的
ROWNUM
行号通过外部的查询筛选出后
5
条
举个栗子:显示雇员表中前5条记录
SELECT * FROM (
SELECT empno,ename,job,hiredate,sal,mgr,deptno,ROWNUM rn
FROM emp WHERE ROWNUM<=5) temp
WHERE temp.rn>0 ;
注意:上例的简便写法:此写法得到的值与上例一致,但这种写法是无法进行分页的扩展的;所以不推荐
SELECT empno,ename,job,hiredate,sal,ROWNUM rn
FROM emp WHERE ROWNUM<=5
再举个栗子:显示雇员表中的6~10条记录
SELECT * FROM (
SELECT empno,ename,job,hiredate,sal,mgr,deptno,ROWNUM rn
FROM emp WHERE ROWNUM<=10) temp
WHERE temp.rn>5 ;