伪列概述
DM伪列在语法上和表中的列很相似,查询时能返回一个值,但实际上伪列在表中并不存在。用户可以对伪列进行查询,但不能插入、更新和删除它们的值。DM支持的伪列有:ROWNUM,ROWID,USER,UID,TRXID等。
- rowid
DM 中行标识符 ROWID 用来标识数据库基表中每一条记录的唯一键值,标识了数据记录的确切的存储位置。如果用户在选择数据的同时从基表中选取 ROWID,在后续的更新语句中,就可以使用 ROWID 来提高性能。如果在查询时加上 FOR UPDATE 语句,该数据行就会被锁住,以防其他用户修改数据,保证查询和更新之间的一致性。
SQL> select employee_id,employee_name,salary,rowid from DMHR.EMPLOYEE where rowid = 2;
行号 EMPLOYEE_ID EMPLOYEE_NAME SALARY ROWID
---------- ----------- ------------- ----------- --------------------
1 1002 程擎武 9000 2
已用时间: 54.530(毫秒). 执行号:1920.
SQL> update DMHR.EMPLOYEE set salary = 10000 where rowid = 2;
影响行数 1
已用时间: 77.662(毫秒). 执行号:1921.
SQL> commit;
操作已执行
已用时间: 35.668(毫秒). 执行号:1922.
SQL> select employee_id,employee_name,salary,rowid from DMHR.EMPLOYEE where rowid = 2;
行号 EMPLOYEE_ID EMPLOYEE_NAME SALARY ROWID
---------- ----------- ------------- ----------- --------------------
1 1002 程擎武 10000 2
已用时间: 0.732(毫秒). 执行号:1923.
SQL>
- rownum
rownum表示从表中查询或者连接查询的行号,值为1...N,N是行的数量。rownum一个重要作用是:限制查询返回行数。例如,我们只想看到前5行数据,可以这样写:
SQL> select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE where rownum <= 5;
行号 EMPLOYEE_ID EMPLOYEE_NAME SALARY ROWNUM
---------- ----------- ------------- ----------- --------------------
1 1001 马学铭 30000 1
2 1002 程擎武 10000 2
3 1003 郑吉群 15000 3
4 1004 陈仙 12000 4
5 1005 金纬 10000 5
已用时间: 0.820(毫秒). 执行号:1975.
SQL>
特点一:一个rownum值不是被永久的分配给一行数据的。表中的某一行并没有标号,不可以查询rownum为某个值的行。rownum值只有当被分配之后才会增长,初始值为1。只有满足一行后,rownum才会加1,否则维持原值不变。因此,以下语句在任何时候都不能返回数据:
SQL> select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE where rownum > 5;
未选定行
已用时间: 2.514(毫秒). 执行号:1976.
SQL> select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE where rownum = 5;
未选定行
已用时间: 44.993(毫秒). 执行号:1977.
SQL>
特点二:rownum值的分配是在查询的谓词解析之后,任何排序和聚合之前进行的.因此,在排序和聚合使用 ROWNUM 时需要注意,可能得到并非预期的结果。例如,我们要查询工资最高的5个人的信息:
SQL> select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE where rownum <= 5 order by salary desc;
行号 EMPLOYEE_ID EMPLOYEE_NAME SALARY ROWNUM
---------- ----------- ------------- ----------- --------------------
1 1001 马学铭 30000 1
2 1003 郑吉群 15000 3
3 1004 陈仙 12000 4
4 1005 金纬 10000 5
5 1002 程擎武 10000 2
已用时间: 2.738(毫秒). 执行号:1938.
SQL>
以上语句只会对EMPLOYEE表前5行按工资排序输出,并不是按表的所有数据排序后输出前5行,要实现后者,需要使用以下语句:
select * from (select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE order by salary desc) where rownum <= 5;
或者
select top 5 employee_id,employee_name,salary,rownum from DMHR.employee order by salary desc;
rownum的使用存在以下限制:
1.在查询中,ROWNUM 可与任何数字类型表达式进行比较及运算,但不能出现在含OR 的布尔表达式中,否则报错处理;
2.ROWNUM 可以在非相关子查询中使用;当参数 ENABLE_RQ_TO_INV 等于 1 时,部分相关子查询支持使用;
3.在非相关子查询中,ROWNUM只能实现与TOP相同的功能,因此子查询不能含ORDER BY 和 GROUP BY; 4.ROWNUM 所处的子谓词只能为如下形式: ROWNUM op exp,exp 的类型只能是立即数、参数和变量值,op ∈ {<, <=, >, >=, =, <>}。
- uid和user
user和 uid分别用来表示当前用户的用户名和用户标识。
SQL> select top 5 employee_id,employee_name,salary,user,uid from DMHR.employee order by salary desc;
行号 EMPLOYEE_ID EMPLOYEE_NAME SALARY USER() UID
---------- ----------- ------------- ----------- ------ -----------
1 1001 马学铭 30000 SYSDBA 50331649
2 3001 苏国华 30000 SYSDBA 50331649
3 7001 郑晓同 30000 SYSDBA 50331649
4 7241 高念 19990 SYSDBA 50331649
5 7240 陈珂 19980 SYSDBA 50331649
已用时间: 1.021(毫秒). 执行号:1956.
SQL> select user(),uid;
行号 USER() UID
---------- ------ -----------
1 SYSDBA 50331649
已用时间: 55.743(毫秒). 执行号:1957.
SQL>
- trxid
trxid用来表示当前事务的事务标识。
SQL> select top 5 employee_id,employee_name,salary,trxid from DMHR.employee order by salary desc;
行号 EMPLOYEE_ID EMPLOYEE_NAME SALARY TRXID
---------- ----------- ------------- ----------- --------------------
1 1001 马学铭 30000 3882
2 3001 苏国华 30000 3877
3 7001 郑晓同 30000 3877
4 7241 高念 19990 3877
5 7240 陈珂 19980 3877
已用时间: 29.561(毫秒). 执行号:1960.
SQL>
- sessid
sessid用来表示当前会话的 ID 标识。
SQL> select top 5 employee_id,employee_name,salary,sessid from DMHR.employee order by salary desc;
行号 EMPLOYEE_ID EMPLOYEE_NAME SALARY SESSID
---------- ----------- ------------- ----------- --------------------
1 1001 马学铭 30000 139625026624328
2 3001 苏国华 30000 139625026624328
3 7001 郑晓同 30000 139625026624328
4 7241 高念 19990 139625026624328
5 7240 陈珂 19980 139625026624328
已用时间: 0.977(毫秒). 执行号:1964.
SQL>
- phyrowid
phyrowid 用来表示当前记录的物理存储信息。
PHYROWID 值由聚集 B 树或二级 B 树中物理记录的文件号、页号、页内槽号组成,能体现聚集 B 树或二级 B 树的存储信息,聚集 B 树记录的最高位为 1。
当查询语句中实际使用 CSCN、CSEK、BLKUP 操作符时,PHYROWID 内容是聚集 B 树中记录的物理存储地址;当查询语句中实际仅使用 SSEK、SSCN 操作符时,PHYROWID 内容是二级 B 树中记录的物理存储地址。
SQL> select top 5 employee_id,employee_name,salary,phyrowid from DMHR.employee order by salary desc;
行号 EMPLOYEE_ID EMPLOYEE_NAME SALARY PHYROWID
---------- ----------- ------------- ----------- --------------------
1 1001 马学铭 30000 4611686018439970817
2 3001 苏国华 30000 4611686018440757255
3 7001 郑晓同 30000 4611686018440757271
4 7241 高念 19990 4611686018440364084
5 7240 陈珂 19980 4611686018440364083
已用时间: 1.283(毫秒). 执行号:1969.
SQL>