二、伪列:
在oracle数据库中为了实现完整的关系数据库的功能,专门为用户提供了许多的伪列,
像序列时所使用的nextval和currval就是两个默认提供的伪列同时在之前使用的sysdate
与systimestamp也属于伪列(而查询使用的dual称为伪表),这些数据伪列并不是用户
用户在建立数据库时由用户完成的,而oracle自动帮助用户建立的,用户只需要按照要求
使用即可,其中两个重要的伪列:rownum,rowid.
rowid 伪列:
在数据表中每一行所保存的记录,实际上oracle都会默认为每条记录分配一个唯一的地址
编号,而这个地址编号就是通过rowid进行表示的,rowid本身是一个数据的伪列,所有
的数据都利用rowid进行数据定位。
范例:观察rowid的存在
select rowid,deptno,dname,loc from dept;
rowid组成
rowid:AAASNJAAEAAAAIUAAA
数据对象号(data object number)为AAASNJ
相对文件号(relative file number)为AAE
数据块号(block number)为AAAAIU
数据行号(row number)为AAA
rowid的操作函数
NO
|
函数名称
|
描述
|
1
|
DBMS_ROWID.rowid_object(ROWID)
|
从一个ROWID之中,取得数据对象号
|
2
|
DBMS_ROWID.rowid_relative_fno(ROWID)
|
从一个ROWID之中,取得相对文件号
|
3
|
DBMS_ROWID.rowid_block_number(ROWID)
|
从一个ROWID之中,取得数据块号
|
4
|
DBMS_ROWID.rowid_row_number(ROWID)
|
从一个ROWID之中,取得数据行号
|
select rowid,
DBMS_ROWID.rowid_object(rowid) 数据对象号,
DBMS_ROWID.rowid_relative_fno(ROWID) 相对文件号,
DBMS_ROWID.rowid_block_number(ROWID) 数据块号,
DBMS_ROWID.rowid_row_number(ROWID) 数据行号,
deptno,dname,loc from dept;
rownum伪列:
在所有的伪列之中,rownum是一个非常重要的核心重点.
rownum不是固定于某行数据的,是根据查询的不同进行累加的结果。
rownum除了可以自动的进行行号的显示之外,也可以完成一下两个常用操作:
操作一:取出一个查询的第一行记录;
操作二:取出一个查询的前n行记录;
select rownum,empno,ename,job,sal,hiredate from emp;
范例:使用rownum取得首行
注意:只能是首行,不能是其他行,因为rownum是随机生成的,是在select子句之中出现,
where 是优先于select执行。
select * from emp where rownum=1;
范例:使用rownum取得前n行
select * from emp where rownum<=5;
数据的分页显示:
分页操作组成:
数据显示部分:主要是从数据表之中遴选出指定的部分数据,需要rownum伪列才可以完成;
分页控制部分:留给用户的控制端,用户只需要选择指定的页数,那么应用程序就会根据用
户的选择,列出指定的部分数据,相当于控制了格式中的currentPage;
分页操作的语法:
select * from (
select 列1 ROWNUM rownum别名
from 表名称 别名
where ROWNUM<=(currentPage(当前页)*linesize(每页显示记录行数)))temp
where temp.rownum别名>(currentPage(当前页)-1)*linesize(每页显示记录行数);
范例:实现数据的分页,查询第一页数据(currentpage=1,pagesize=5)
select * from(
select empno,ename,job,mgr,sal,ROWNUM row_num from emp
where ROWNUM<=5)temp
where temp.row_num > 0;
范例:实现数据的分页,查询第二页数据(currentpage=2,pagesize=5)
select * from(
select empno,ename,job,mgr,sal,ROWNUM row_num from emp
where ROWNUM<=10)temp
where temp.row_num > 5;
对于分页在数据开发之中一定会出现,而且使用rownum实现分页,也一定会一直出现。
FETCH语句
在oracle12c之中为了方便数据的分页显示操作,专门提供了FETCH语句,使用此语句可以方便的
取得指定范围的操作数据。
FETCH语句语法
select [distinct]分组字段1[as][列别名],[分组字段2]...
from 表名称 [表别名]
[where 条件(s)]
[group by 分组字段1,分组字段2..]
[having过滤条件(S)]
[order by 排序字段ASC|DESC]
[FETCH FIRST行数]|[offset开始位置rows FETCH NEXT个数]|[FETCH NEXT百分比
PERCENT]ROW ONLY
此语句有三种使用方式:
取得前N行记录:FETCH FIRST 行数 ROW ONLY;
取得指定范围的记录:OFFSET 开始位置 ROW FETCH NEXT 个数 ROWS ONLY;
按照百分比取得记录: FETCH NEXT 百分比 PERCENT RWOS ONLY
范例:取得emp表的前5行记录
select * from emp order by sal fetch first 5 row only;
范例:取得4-5条记录
select * from emp order by sal offset 3 row fetch net 2 rows only;
范例:取得10%的数据
select * from emp order by sal fetch next 10 percent rows only;