写点什么

YashanDB 伪列

作者:YashanDB
  • 2025-03-25
    广东
  • 本文字数:2045 字

    阅读完需:约 7 分钟

伪列的行为类似于普通列,但其数据并不存储在表中。用户可以 SELECT 伪列,但不能对伪列进行 INSERT、UPDATE、DELETE 操作。

YashanDB 存在如下五种伪列:

  • ROWSCN

  • ROWID

  • ROWNUM

  • SEQUENCE

  • USER

ROWSCN 伪列

ROWSCN 伪列表示行最后一次被修改的 SCN。YashanDB 的 ROWSCN 为页面级别,一般情况下返回的 ROWSCN 是行所在页面最后一次修改并提交的 BLOCK SCN,若使用特殊查询条件可能会返回该行最后一次修改并提交的 SCN,例如使用 ROWID 为查询条件时。

若事务修改了表中某行数据并提交了修改,后续查询该行的 ROWSCN 时,返回值仅会大于或等于修改前的 ROWSCN。

该伪列仅适用于 HEAP 表。

示例(HEAP 表)


ROWID 伪列

ROWID 伪列表示行所在的地址。ROWID 伪列的类型为 ROWID 类型,使用限制等更多说明请查阅ROWID UROWID

该伪列仅适用于 HEAP 表。

示例(HEAP 表)

SELECT ROWID FROM area;
复制代码


ROWNUM 伪列

ROWNUM 伪列是系统顺序分配的查询返回的行编号,返回的第一行分配为 1,第二行分配为 2,依此类推。该伪列可用于限制查询返回的总行数。

分布式部署中不可使用该伪列。

ROWNUM 在列存表中的使用限制如下:

  • ROWNUM 只能与常量进行比较。

  • 条件语句中不能使用小于、小于等于、大于或大于等于运算符。

  • 使用等值比较时,ROWNUM 所比较的对象只能为常量 1。

  • 不允许 ROWNUM 在 or 的左右条件中使用。

  • ROWNUM 在过滤条件中只能使用一次,且只能单独使用,不允许参与运算或作为函数入参。

  • ROWNUM 不能出现在非比较谓词和不等于比较中,例如 in。

  • 在外连接的连接条件中不可使用 ROWNUM。

ROWNUM 伪列的常用场景:

WHERE 条件中做行数限制

  • WHERE ROWNUM < 常数,返回常数-1 行的记录。

  • WHERE ROWNUM = 常数,ROWNUM 从 1 开始累加,因此 ROWNUM= 1 可以返回 1 条记录;当 ROWNUM = 任何非 1 值时,条件恒为 FALSE,无法返回任何结果。

  • WHERE ROWNUM > 常数,常数小于 1,则条件恒为 TRUE;常数大于等于 1,则条件恒为 FALSE(即查询结果恒为空)。

示例(HEAP 表)

SELECT area_no,area_name,DHQ FROM area WHERE ROWNUM < 2;
AREA_NO AREA_NAME DHQ ------- ------------------------------------------------------------- --------------------- 01 华东 Shanghai
复制代码


ROWNUM 与 ORDER BY 一起使用

先从表中取出符合 ROWNUM 条件的行然后再进行排序,其结果取决于执行计划,执行计划不同可能会导致取得的行不同。

示例(单机、共享集群部署)

-- 创建表STUDENTSCREATE 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 + limitSELECT score FROM STUDENTS ORDER BY score DESC LIMIT 3;
-- 查询成绩前3的学生成绩,可以使用子查询 + ROWNUMSELECT score FROM (SELECT score FROM STUDENTS ORDER BY score DESC) WHERE ROWNUM < 4;
复制代码

ROWNUM 与 JOIN 一起使用

在 JOIN 语句中,ROWNUM 与在 WHERE 中使用相同的规则判断。

使用 ROWNUM 给表中每一行附上唯一的值

示例(单机、共享集群部署)

UPDATE STUDENTS SET num = ROWNUM;
复制代码


SEQUENCE 伪列

SEQUENCE 伪列是创建序列对象时生成的唯一序列号,可分为如下两种类型:

  • CURRVAL:返回当前序列号值,即当前 session 上一次获取到的 NEXTVAL 值。

  • NEXTVAL:增加序列号的值并返回序列的 NEXTVAL。

分布式部署中不可使用该伪列。

获取序列号:

sequence.CURRVALsequence.NEXTVAL
复制代码


获取指定 schema 的序列号:

schema.sequence.CURRVALschema.sequence.NEXTVAL
复制代码


dblink 获取远端序列号:

[schema.]sequence.CURRVAL@DBLINK_NAME[schema.]sequence.NEXTVAL@DBLINK_NAME
复制代码


可以在以下场景使用 CURRVAL 伪列与 NEXTVAL 伪列:

  • 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_yashan_pseudo; SELECT seq_yashan_pseudo.NEXTVAL FROM dual;  SEQ_YASHAN1.NEXTVAL---------------------                    1
SELECT seq_yashan_pseudo.CURRVAL FROM dual; SEQ_YASHAN1.CURRVAL--------------------- 1
复制代码

USER 伪列

USER 伪列返回当前登录用户的用户名,返回值类型为 VARCHAR(64)。

分布式部署中不可使用该伪列。

示例(单机、共享集群部署)

SELECT USER FROM DUAL;
复制代码


发布于: 2 小时前阅读数: 7
用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB伪列_数据库_YashanDB_InfoQ写作社区