#伪列
伪列的行为类似于普通列,但其数据并不存储在表中。用户可以SELECT伪列,但不能对伪列进行INSERT、UPDATE、DELETE操作。
YashanDB存在如下五种伪列:
- ROWSCN
- ROWID
- ROWNUM
- SEQUENCE
- USER
# ROWSCN伪列
ROWSCN伪列表示行最后一次被修改的SCN。YashanDB的ROWSCN为页面级别,一般情况下返回的ROWSCN是行所在页面最后一次修改并提交的BLOCK SCN,如使用特殊查询条件可能会返回该行最后一次修改并提交的SCN,例如使用ROWID为查询条件时。
若事务修改了表中某行数据并提交了修改,后续查询该行的ROWSCN时,返回值仅会大于或等于修改前的ROWSCN。
该伪列仅适用于HEAP表。
示例
SELECT ROWSCN FROM area;
# ROWID伪列
ROWID伪列表示行所在的地址。ROWID伪列的类型为ROWID类型,更多说明请参考ROWID UROWID章节描述。
该伪列仅适用于HEAP表。
示例
SELECT ROWID FROM area;
# ROWNUM伪列
ROWNUM伪列是系统顺序分配的查询返回的行编号,返回的第一行分配的是1,第二行是2,依此类推。该伪列可用于限制查询返回的总行数。
分布式部署中不支持使用该伪列。
示例
SELECT * FROM area WHERE ROWNUM < 2;
AREA_NO AREA_NAME DHQ
------- ------------------------------------------------------------- ---------------------
01 华东 Shanghai
若将ROWNUM与ORDER BY一起使用,会先从表中取出符合ROWNUM条件的行然后再进行排序,其结果取决于执行计划,执行计划不同可能会导致取得的行不同。
示例
--创建表STUDENTS
CREATE TABLE STUDENTS(num INT,score INT);
INSERT INTO STUDENTS VALUES(1,99);
INSERT INTO STUDENTS VALUES(1,76);
INSERT INTO STUDENTS VALUES(1,84);
INSERT INTO STUDENTS VALUES(1,63);
INSERT INTO STUDENTS VALUES(1,88);
COMMIT;
-- 查询成绩前3的学生成绩,先取出3行再进行排序,结果不一定正确
SELECT score FROM STUDENTS WHERE ROWNUM < 4 ORDER BY score DESC;
-- 查询成绩前3的学生成绩,可以使用order by + limit
SELECT score FROM STUDENTS ORDER BY score DESC LIMIT 3;
-- 查询成绩前3的学生成绩,可以使用子查询 + ROWNUM
SELECT score FROM (SELECT score FROM STUDENTS ORDER BY score DESC) WHERE ROWNUM < 4;
YashanDB支持使用ROWNUM给表上每一行附上唯一的值。
示例
UPDATE STUDENTS SET num = ROWNUM;
YashanDB不支持使用ROWNUM大于某正数作为查询条件,会导致查询结果总为空。
示例
SELECT * FROM STUDENTS WHERE ROWNUM > 1;
更多使用场景和限制请参考condition章节中有关ROWNUM部分的描述。
# SEQUENCE伪列
SEQUENCE伪列是创建序列对象时生成的唯一序列号,可分为如下两种类型:
- CURRVAL: 返回当前序列号值,即当前session上一次获取到的NEXTVAL值。
- NEXTVAL: 增加序列号的值并返回序列的NEXTVAL。
分布式部署中不支持使用该伪列。
示例
获取序列号:
sequence.CURRVAL
sequence.NEXTVAL
获取指定schema的序列号:
schema.sequence.CURRVAL
schema.sequence.NEXTVAL
可以在以下场景使用CURRVAL伪列与NEXTVAL伪列:
- SELECT语句中select列中不包含子查询的场景
- INSERT语句中的select从句
- INSERT语句中的values从句
- UPDATE语句中的set从句
禁止使用的场景:
- DELETE, SELECT, UPDATE语句中的子查询语句
- 带有DISTINCT算子的SELECT语句
- 带有GROUP BY或者ORDER BY子句的SELECT语句
- 多个SELECT语句通过UNION集合
- SELECT语句中的where子句
当你创建序列后,使用CURRVAL前必须先查询NEXTVAL来初始化CURRVAL值。
示例
用以下语法获取序列号:
CREATE SEQUENCE seq_yashan1;
SELECT seq_yashan1.NEXTVAL FROM dual;
SEQ_YASHAN1.NEXTVAL
---------------------
1
SELECT seq_yashan1.CURRVAL FROM dual;
SEQ_YASHAN1.CURRVAL
---------------------
1
# USER伪列
USER伪列返回当前登录用户的用户名,返回值类型为VARCHAR(64)。
分布式部署中不支持使用该伪列。
示例
SELECT USER FROM DUAL;