dual,rowid,rownum
一、
dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。我们可以用它来做很多事情,如下:
1、查看当前用户,可以在 SQL Plus中执行下面语句 select user from dual;
2、用来调用系统函数
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;--获得当前系统时间
select SYS_CONTEXT('USERENV','TERMINAL') from dual;--获得主机名
select SYS_CONTEXT('USERENV','language') from dual;--获得当前 locale
select dbms_random.random from dual;--获得一个随机数
3、得到序列的下一个值或当前值,用下面语句
select your_sequence.nextval from dual;--获得序列your_sequence的下一个值
select your_sequence.currval from dual;--获得序列your_sequence的当前值
4、可以用做计算器 select 7*9 from dual;
------
Oracle系统中dual表是一个“神秘”的表,网上有很多网友都对该表进行了测试,该表只有一行一列,其实该表和系统中的其他表一样,一样可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。此时也不要慌乱,可以通过执行以下步骤来进行恢复。可以用sys用户登陆。
SQL> create pfile=’d:pfile.bak’ from spfile
SQL> shutdown immediate
在d:pfile.bak文件中最后加入一条:
replication_dependency_tracking = FALSE
重新启动数据库:
SQL> startup pfile=’d:pfile.bak’
SQL> create table “sys”.”DUAL”
[an error occurred while processing this directive]
二、
d)dbms_rowid.rowid_row_number通过ROWID,获取数据块中的行编号
SQL> select dbms_rowid.rowid_row_number('AAAMfKAAEAAAAAQAAC') as row_no from dual;
ROW_NO
----------
2
3、受限ROWID(resticted rowid)
a.受限rowid用二进制表示每行数据的物理地址,当使用SQL Plus查询时,二进制表示法被转换为varchar2或16进制表示。
SQL> select dbms_rowid.rowid_to_restricted(rowid,1) as restricted_rowid,dept.* from scott.dept;
RESTRICTED_ROWID DEPTNO DNAME LOC
------------------------------- ------------- --------------------- ------------------
00000010.0000.0004 10 ACCOUNTING NEW YORK
00000010.0001.0004 20 RESEARCH DALLAS
00000010.0002.0004 30 SALES CHICAGO
00000010.0003.0004 40 OPERATIONS BOSTON
b.受限rowid格式:
共16位,包含3部分:AAAAAAAA.BBBB.CCCC
a)AAAAAAAA:保存该行数据的数据块编号
b)BBBB:该行数据在数据块中的行编号
c)CCCC:包含该行数据的数据文件编号
(四)、逻辑ROWID(logical rowid)
1、概述:索引组织的表(IOT)中,row保存在索引的叶子节点,可以在块内或块间移动。
因此,这些rows没有固定的物理地址,无法根据物理地址来唯一标识。
Oracle提供了逻辑ROWID,来标识IOT中的行,逻辑ROWID是基于表的主键;
Oracle可根据这些逻辑ROWID为IOT创建第二索引。
每个第二索引使用的逻辑ROWID都包含一个physical guess;
physical guess标识了当创建第二索引时,IOT中每个row的块位置;
三、ROWID相关的包,DBMS_ROWID
SubprogramDescriptionROWID_BLOCK_NUMBER
Returns the block number of a ROWID
ROWID_CREATE
Creates a ROWID, for testing only
ROWID_INFO(过程)
Returns the type and components of a ROWID
ROWID_OBJECT
Returns the object number of the extended ROWID
ROWID_RELATIVE_FNO
Returns the file number of a ROWID
ROWID_ROW_NUMBER
Returns the row number
ROWID_TO_ABSOLUTE_FNO
Returns the absolute file number associated with the ROWID for a row in a specific table
ROWID_TO_EXTENDED
Converts a ROWID from restricted format to extended
ROWID_TO_RESTRICTED
Converts an extended ROWID to restricted format
ROWID_TYPE Function
Returns the ROWID type: 0 is restricted, 1 is extended
ROWID_VERIFY
Checks if a ROWID can be correctly extended by the ROWID_TO_EXTENDED function’
三、
ROWNUM
定义: ROWNUM是一个伪列,标识了select从一个表或一组连接(JOIN)的表中查询数据时,返回记录的顺序。
Oracle在执行select查询时,会按照返回的row的顺序,依次为row分配一个序号:
返回的第一条row的序号为1,第二条row的序号为2,以此类推。
这个序号即为每条row的rownum。
注意1:同一个查询语句中,如果ROWNUM后,含有ORDER BY子句时:
Oracle先返回未应用ORDER BY处理的结果,分配ROWNUM后,再根据ORDER BY子句的要求排序。
因此,返回的结果中,ROWNUM顺序是混乱的。如:
SQL> SELECT ROWNUM,DEPT.* FROM SCOTT.DEPT ORDER BY DNAME;
ROWNUM DEPTNO DNAME LOC
-------------- ------------- -------------------- -------------
1 10 ACCOUNTING NEW YORK
4 40 OPERATIONS BOSTON
2 20 RESEARCH DALLAS
3 30 SALES CHICAGO
未应用ORDER BY的结果为:
SQL> SELECT ROWNUM,DEPT.* FROM SCOTT.DEPT;
ROWNUM DEPTNO DNAME LOC
-------------- ------------- ---------------------- -------------
1 10 ACCOUNTING NEW YORK
2 20 RESEARCH DALLAS
3 30 SALES CHICAGO
4 40 OPERATIONS BOSTON
欲使ORDER BY后的ROWNUM连续,可将ORDER BY放入子查询,如:
SQL> SELECT ROWNUM,T.* FROM (SELECT DEPT.* FROM SCOTT.DEPT ORDER BY LOC) T;
ROWNUM DEPTNO DNAME LOC
-------------- ------------- --------------------- -------------
1 40 OPERATIONS BOSTON
2 30 SALES CHICAGO
3 20 RESEARCH DALLAS
4 10 ACCOUNTING NEW YORK
注意2:对ROWNUM应用>,>=,=,between...and条件,返回结果都为空:
因为,当返回第一条记录,作为结果的第1条,分配rownum=1,
应用>,>=,=,between...and条件判断时,不满足条件,记录删除;
返回下一条记录时,仍作为结果的第1条,分配rownum=1,仍不满足条件,依次类推,结果为空。
select rownum from test where rownum=1; //返回1条记录(结果集中的第一条)
select rownum from test where rownum=2;
//返回0条。根据ROWNUM定义,不难看出,返回第1条记录时,因ROWNUM=1,因此过滤掉。
select rownum from test where rownum>10;
select rownum from test where rownum between 2 and 4;
应用:
1)可通过ROWNUM限制返回结果的记录数(行数)
SQL> select rownum from test where rownum<10;
2)通过ROWNUM为表中某列产生一个唯一(UNIQUE)值
SQL> UPDATE table_name SET column_name = ROWNUM;
//将rownum指定为该行某列的值。
dual,rowid,rownum的更多相关文章
- Oracle中的rowid rownum
1. rowid和rownum都是虚列 2. rowid是物理地址,用于定位oracle中具体数据的物理存储位置 3. rownum则是sql的输出结果排序,从下面的例子可以看出其中的区别. rowi ...
- 使用rowid和rownum获取记录时要注意的问题
我们知道.rowid和rownum在Oracle中都是能够被当做伪劣使用的,主要用来定位表中特定的记录,但它们是有差别的,rowid是和行记录的物理地址相应的.而rownum则不是,是通过返回的记录集 ...
- rownum和rowid伪列
select row employee_id,last name,salary from employees; select row employee_id,last name,salary from ...
- 讨论oracle在rowid和rownum
[ 概要 ] 刚刚接触oracle的同学可能经常会被rowid和rownum这两个词弄混, 弄清楚这两个家伙对于我们写sql会有非常大的帮助, 以下偶就抛砖引玉, 简单地谈谈他们之间的差别吧. [ 比 ...
- Oracle的RowId和Rownum
本文参照来自:https://www.cnblogs.com/whut-helin/p/8024860.html 由sql select p.*,rowid,rownum from promotion ...
- Oracle 分页 ROWNUM 两种分页方法和ROWID用法
一 原因一 oracle默认为每个表生成rowmun,rowid字段,这些字段我们称之为伪列 测试表 CREATE TABLE A ( AID NUMBER() primary key, ANAME ...
- 初探oracle删除重复记录,只保留rowid最小的记录
如题,初探oracle删除重复记录,只保留rowid最小的记录(rowid可以反映数据插入到数据库中的顺序) 一.删除重复记录可以使用多种方法,如下只是介绍了两种方法(exist和in两种). 1.首 ...
- rowid
rowid:select t.*,t.rowid from test t; -- AACeJKAAIAAAA4XAAA 注:有个很二需求,通过一个存储过程插入的数据必须是放在一块的,不能分散开存储,考 ...
- oracle删除重复记录,只保留rowid最小的记录
初探oracle删除重复记录,只保留rowid最小的记录 如题,初探oracle删除重复记录,只保留rowid最小的记录(rowid可以反映数据插入到数据库中的顺序) 一.删除重复记录可以使用多种 ...
随机推荐
- Linux下用SCP无需输入密码传输文件
在Linux环境下,两台主机之间传输文件一般使用scp命令,通常用scp命令通过ssh获取对方linux主机文件的时候都需要输入密码确认. 不过通过建立信任关系,可以实现不输入密码. 这里假设A的IP ...
- springmvc+spring+mybatis分页查询实例版本3,添加条件检索
在第二个版本上添加了姓名模糊查询,年龄区间查询;自以为easy,结果发现mybatis的各种参数写法基本搞混或是忘了,zuo啊,直接上代码,然后赶紧把mybatis整理一遍再研究自己的项目,应该还会有 ...
- PTPX中的clock tree与LP design
PTPX在加入CPF/UPF这样的文件后,可以分析multi-voltage,power-gating这样的设计. 针对某个power rail的cell,PTPX支持进行annotate. set_ ...
- 【PyQuery】PyQuery总结
pyquery库是jQuery的Python实现,可以用于解析HTML网页内容, 官方文档地址是:http://packages.python.org/pyquery/. 二.使用方法 ? 1 fro ...
- C#下调用C++ SDK的编码常识
一组编码规范,通过C#调用C++ 自动封装的C# SDK,会发现面向对象思想的重要性. C++ SDK可以使用自动封装工具转换成C# SDK.但需要遵守如下规则: 1.如果需要对C#对象进行判断,则分 ...
- NOIP201405生活大爆炸版石头剪刀布
NOIP201405生活大爆炸版石头剪刀布 试题描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一 样,则不分胜负.在<生活大爆炸>第二季第 8 集中出现了 ...
- Java Persistence API(转)
定义 Java Persistence API JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中.[编辑本段]起源 Sun引入新的JPA ORM规范 ...
- sp_addlinkedserver 方法应用
EXEC sp_addlinkedserver @server='DBVIP',--被访问的服务器别名 @srvproduct='', @provider='SQLO ...
- 160901、在大型项目中组织CSS
编写CSS容易. 编写可维护的CSS难. 这句话你之前可能听过100次了. 原因是CSS中的一切都默认为全局的.如果你是一个C程序员你就知道全局变量不好.如果你是任何一种程序员,你都知道隔离和可组合的 ...
- HttpWebRequest:百度定位当前位置解析
HttpWebRequest request = (System.Net.HttpWebRequest)WebRequest.Create("http://api.map.baidu.com ...