Oracle 数据库的SQL语言中经常用到一些伪列,这些伪列为数据管理提供了方便。其中咱们见得最多的应该是 rownum 和 rowid
1、伪列的特点和种类
- 伪列没有实际保存在数据表中。
- 可以对伪列执行 select 操作,但不能 insert 、update或者delete 它们。
- 它与不带参数的function的区别在于,伪列对每一行数据返回不同的值,而不带参数的function一般对所有行返回同一个值。
种类:
- 与树状结构查询语句相关的伪列(包括 CONNECT_BY_ISCYCLE、CONNECT_BY_ISLEAF 和 LEVEL);
- 与序列对象相关的伪列(CURRVAL和NEXTVAL);
- 与版本控制相关的伪列(VERSIONS_STARTSCN、VERSIONS_STARTTIME、VERSIONS_ENDSCN、VERSIONS_ENDTIME、VERSIONS_XID、VERSIONS_OPERATION);
- 与嵌套表数据相关的伪列(COLUMN_VALUE);
- 与对象数据表相关的伪列(OBJECT_ID、OBJECT_VALUE);
- 与数据行相关的伪列(ORA_ROWSCN、ROWID、ROWNUM)。
2、与树状结构查询语句相关的伪列
首先对树状结构查询进行说明,其语法结构是
Select ... start with ... connect by ... prior,即:
能够进行树状结构查询的数据表,一般都会有个指向自身主键的外键,以此体现出隶属关系
Oracle 提供的示例中,HR模式中的 employees 便是此类数据表,该表结构如下:
hr@ORA11G> desc employees;
Name Null? Type---------------------------------------- -------- ------------------------------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
其中,Employee_id 是主键,而 Manager_id 则以 Employee_id 为外键。
我们仅考虑其中的 Employee_id、Last_name 和 Manager_id 三项数据,部分数据如下:
EMPLOYEE_ID LAST_NAMEMANAGER
----------- ------------------------- ----------
100 King
101 Kochhar 100
102 De Haan 100
103 Hunold 102
104 Ernst 103
105 Austin 103
106 Pataballa 103
107 Lorentz 103