zoukankan      html  css  js  c++  java
  • Oracle Schema Objects——伪列ROWID Pseudocolumn(ROWNUM、ROWID)

    Oracle伪列

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

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

     

    两个重要的伪列:ROWNUMROWID

     

    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 ;

     

  • 相关阅读:
    JN_0026:FTP连接站点 规避防火墙
    JS_0002:js读取外部json文件
    JQPlug0002:layer Zindex不断增加的问题 弹窗一直置顶
    JQPlug0001:layer父子页面通信,常用打开模版
    Web_0010:Html打包EXE方法
    Web_0009:win系统下注册自己的协议,用于web项目启动本地程序
    ZAB 和 Paxos 算法的联系与区别?
    保证缓存与数据库双写时的数据一致性
    解决 Redis 的并发竞争 Key 问题
    缓存雪崩和缓存穿透
  • 原文地址:https://www.cnblogs.com/thescentedpath/p/ROWIDPseudocolumn.html
Copyright © 2011-2022 走看看