Oracle伪列

在Oracle数据库之中为了实现完整的关系数据库的功能,专门为用户提供了许多的伪列.

这些数据伪列并不是用户在建立数据库对象时由用户完成的,而是Oracle自动帮助用户建立的,用户只需要按照要求使用即可

两个重要的伪列:ROWNUM、ROWID

ROWID伪列

  • 在数据表中每一行所保存的记录,实际上Oracle都会默认为每条记录分配一个唯一的地址编号,而这个地址编号就是通过ROWID进行表示的, ROWID本身是一个数据的伪列,所有的数据都利用ROWID进行数据定位。
  • ROWID的存在:SELECT ROWID,deptno,dname,loc FROM dept ;
  • ROWID组成:AAAR9VAAHAAAACFAAA

数据对象号(data object number)

为AAAWec;

相对文件号(relative file number)

为AAG;

数据块号(block number)

为AAAAC2;

数据行号(row number)

为AAA;

  • 如果需要还原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;

函数名称

描述

DBMS_ROWID.rowid_object(ROWID)

从一个ROWID之中,取得数据对象号

DBMS_ROWID.rowid_relative_fno(ROWID)

从一个ROWID之中,取得相对文件号

DBMS_ROWID.rowid_block_number(ROWID)

从一个ROWID之中,取得数据块号

DBMS_ROWID.rowid_row_number(ROWID)

从一个ROWID之中,取得数据行号

ROWNUM伪列(重要)

ROWNUM表示的是一个数据行编号的伪列,它的内容是在用户查询数据的时候,为用户动态分配的一个数字(行号),

ROWNUM的主要作用:生成行号.

ROWNUM不是固定和数据绑定在一起的。是在用户查询数据的时候,动态分配的.它是根据记录的累加进行的自动编号.

查询雇员编号、姓名、职位、基本工资、雇佣日期等信息并且显示每条记录的行号

SELECT ROWNUM,empno,ename,job,sal,hiredate FROM emp ;

列出薪金高于公司平均薪金的所有员工编号、姓名、基本工资、职位、雇佣日期,所在部门名称、位置,公司的工资等级,但是为了信息浏览方便,要求在每一行数据显示前都增加一个行号。

SELECT ROWNUM rn,e.empno,e.ename,e.sal,e.job,e.hiredate,d.dname,d.loc,s.grade

FROM emp e,dept d,salgrade s

WHERE e.sal> (

SELECT AVG(sal) FROM emp)

AND e.deptno=d.deptno

AND e.sal BETWEEN s.losal AND s.hisal ;

  • ROWNUM作用

ROWNUM除了可以自动的进行行号的显示之外,也可以完成以下两个常用操作:

取出一个查询的第一行记录;

SELECT * FROM emp WHERE ROWNUM=1;

只能查首行,不能查其他行.

取出一个查询的前N行记录;

SELECT * FROM emp WHERE ROWNUM<=5;

如果这个时候使用了范围,那么就不能取得值

SELECT * FROM emp WHERE ROWNUM BETWEEN 5 AND 10;

  • 数据的分页显示

分页操作组成:

数据显示部分

主要是从数据表之中选出指定的部分数据,需要ROWNUM伪列才可以完成;

分页控制部分

留给用户的控制端,用户只需要选择指定的页数,那么应用程序就会根据用户的选择,列出指定的部分数据,相当于控制了格式中的currentPage;

分页操作语法:

SELECT * FROM

(

SELECT 列1 [,列2,...],ROWNUM rownum别名

FROM 表名称 [别名]

WHERE ROWNUM <= (currentPage(当前所在页) * lineSize(每页显示记录行数))

) temp

WHERE temp.rownum别名>(currentPage(当前所在页) - 1) * lineSize(每页显示记录行数) ;

使用ROWNUM进行前N行数据查询

显示雇员表中前5条记录

SELECT * FROM (

SELECT empno,ename,job,hiredate,sal,mgr,deptno,ROWNUM rn

FROM emp WHERE ROWNUM<=5) temp

WHERE temp.rn>0 ;

显示雇员表中的6~10条记录

SELECT * FROM (

SELECT empno,ename,job,hiredate,sal,mgr,deptno,ROWNUM rn

FROM emp WHERE ROWNUM<=10) temp

WHERE temp.rn>5 ;

Oracle 12C新特性 —— FETCH

在Oracle 12C之中为了方便数据的分页显示操作,专门提供了FETCH语句,使用此语句可以方便的取得指定范围内的操作数据。

  • FETCH语句语法

SELECT [DISTINCT] 分组字段1 [AS] [列别名] , [分组字段2 [AS] [列别名] , …]

FROM 表名称1 [表别名1] , 表名称2 [表别名2] ….

[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 开始位置 ROWS FETCH NEXT 个数 ROWS ONLY;

按照百分比取得纪录:

FETCH NEXT 百分比 PERCENT ROWS ONLY。

取得emp表中的前5行纪录

SELECT * FROM emp FETCH FIRST 5 ROW ONLY;

为数据排序,取得前5行纪录

SELECT *

FROM emp

ORDER BY sal DESC

FETCH FIRST 5 ROW ONLY;

取得表中4~5条纪录

从第3行开始,取2条记录

SELECT *

FROM emp

ORDER BY sal DESC

OFFSET 3 ROWS FETCH NEXT 2 ROWS ONLY ;

按百分比取部分数据

SELECT *

FROM emp

ORDER BY sal DESC

FETCH NEXT 10 PERCENT ROWS ONLY ;

Oracle Schema Objects——伪列ROWID Pseudocolumn(ROWNUM、ROWID)的更多相关文章

  1. Oracle Schema Objects——Tables——Oracle Data Types

    Oracle Schema Objects Oracle Data Types 数据类型 Data Type Description NUMBER(P,S) Number value having a ...

  2. Oracle Schema Objects——Sequences(伪列:nextval,currval)

    Oracle Schema Objects 序列的作用 许多的数据库之中都会为用户提供一种自动增长列的操作,例如:在微软的Access数据库之中就提供了一种自动编号的增长列(ID列).在oracle数 ...

  3. Oracle 中的伪列

    昨天做了一个Oracle PL/SQL 相关的测试,其中有一道这样的题目:   下列那些是Oracle的伪列(ACD)  A.ROWID   B.ROW_NUMBER()  C.LEVEL  D.RO ...

  4. Oracle Schema Objects——Index

    索引主要的作用是查询优化. Oracle Schema Objects 查看执行计划的权限:查看执行计划plustrace:set autotrace trace exp stat(SP2-0618. ...

  5. Oracle Schema Objects——Tables——TableStorage

    Oracle Schema Objects Table Storage Oracle数据库如何保存表数据? Oracle Database uses a data segment in a table ...

  6. Oracle Schema Objects——View

    Oracle Schema Objects Oracle视图View 普通视图.物化视图 视图(视图不包含数据,不是段对象,不占用空间,只是一个代码.) 作用: 简化SQL 为安全,不暴露表的名称 视 ...

  7. Oracle Schema Objects(Schema Object Storage And Type)

    One characteristic of an RDBMS is the independence of physical data storage from logical data struct ...

  8. Oracle Schema Objects——Tables——TableType

    Oracle Schema Objects Object Tables object type An Oracle object type is a user-defined type with a ...

  9. Oracle Schema Objects——Tables——Overview of Tables

    Oracle Schema Objects Overview of Tables A table is the basic unit of data organization in an Oracle ...

随机推荐

  1. new/delete 的使用要点

    运算符 new 使用起来要比函数 malloc 简单得多,例如: int *p1 = (int *)malloc(sizeof(int) * length); int *p2 = new int[le ...

  2. (转)MPEG4码流简单分析

    把MPEG4码流的分析和它的I,P,B Frame的判定方法在这里简要记录一下吧,供日后的翻看和大家的参考.   测试解码器测试了很久,由于需要将H264和MPEG4的码流进行分析和判断,并逐帧输入解 ...

  3. ScreenPointToRay - 近视口到屏幕的射线

    正如题目所说,ScreenPointToRay可以计算从Camera的近视口nearClip向前发射一条射线到屏幕上的点的坐标. 函数原型为: public Ray ScreenPointToRay( ...

  4. 【Java面试题】44 java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

    字节流,字符流.字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter.在java.io包中还有许多其他的流 ...

  5. c++ time_t

    type struct tm <ctime> Time structure Structure containing a calendar date and time broken dow ...

  6. 哈希----字符串----time33

    //此处只是获得了字符串的hash值,但是该如何散列到hash表中呢?哪个算法会好些?! 1 //在处理以字符串为键值的哈希时,times33哈希算法有着极快的计算效率和很好的哈希分布 //小写英文单 ...

  7. iotop详解

    有时我们希望知道到底哪个进程产生了IO,这个时候就需要iotop这个工具了.它的输出和top命令类似,简单直观.官网:http://guichaz.free.fr/iotop/需要Python 2.5 ...

  8. 【Rmarkdown rmysql】

    http://stackoverflow.com/questions/21167070/how-to-query-multiple-times-and-close-the-connection-at- ...

  9. linq在获取部门层级树种的应用

    public string GetNavigationsJson() { AjaxA_NAVIGATIONS ajaxnavigations = new AjaxA_NAVIGATIONS(); IL ...

  10. mybatis由浅入深day01_8.2resultMap

    8.2 resultMap mybatis中使用resultMap完成高级输出结果映射. resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可 ...