【赵渝强老师】国产崖山数据库的行号:ROWNUM

简介: YashanDB的ROWNUM伪列行为类似Oracle,仅支持单机/主备及共享集群,分布式集群不可用。其按查询顺序动态分配行号(1起递增),且“先编号后过滤”,故ROWNUM>1等条件恒为空。推荐使用ROW_NUMBER()窗口函数或原生FETCH/OFFSET语法实现稳定分页。

b477.png

YashanDB 崖山数据库 ROWNUM 伪列

YashanDB 的 ROWNUM 伪列,行为高度类似 Oracle,仅单机/主备、共享集群可用;存算一体分布式集群不能使用 ROWNUM。

ROWNUM:查询返回的行,系统顺序分配编号,第一行=1,逐行递增;是先分配行号,再做过滤。


视频讲解如下:


✅ 基础语法(HEAP行存表,最常用)

-- 查出前5行
SELECT t.*, ROWNUM FROM emp t WHERE ROWNUM <=5;

# 输出的信息如下:
 EMPNO ENAME         JOB           MGR HIREDATE         SAL   COMM   DEPTNO  ROWNUM 
------ ------------- ---------- ------ ------------- ------ ------ -------- ------- 
  7369 SMITH         CLERK        7902 1980/12/17       800              20       1
  7499 ALLEN         SALESMAN     7698 1981/2/20       1600    300       30       2
  7521 WARD          SALESMAN     7698 1981/2/22       1250    500       30       3
  7566 JONES         MANAGER      7839 1981/4/2        2975              20       4
  7654 MARTIN        SALESMAN     7698 1981/9/28       1250   1400       30       5
5 rows fetched.

-- 只取第1行
SELECT * FROM emp WHERE ROWNUM = 1;

# 输出的信息如下:
 EMPNO ENAME         JOB           MGR HIREDATE         SAL   COMM   DEPTNO  ROWNUM 
------ ------------- ---------- ------ ------------- ------ ------ -------- ------- 
  7369 SMITH         CLERK        7902 1980/12/17       800              20       1
-
- ROWNUM>1 直接返回空!重点坑
SELECT * FROM emp WHERE ROWNUM >1; -- ❌ 无结果

# 输出的信息如下:
 EMPNO ENAME         JOB           MGR HIREDATE         SAL   COMM   DEPTNO  ROWNUM 
------ ------------- ---------- ------ ------------- ------ ------ -------- -------

原理:ROWNUM 是动态分配,必须先有 ROWNUM=1 的行满足条件,才会继续生成2、3;如果条件 ROWNUM>1,第一行ROWNUM=1不满足,直接丢弃,永远不会生成2。


✅ 排序后分页(一定要子查询!)

⚠️ 坑:WHERE ROWNUM <=10 AND ORDER BY col,ROWNUM 在排序前分配,不是排序后的行号!

正确写法:内层先排序,外层再分配行号

select rownum,ename,sal
from (select * from emp order by sal desc)
where rownum<=5;

# 输出的信息如下:
ROWNUM  ENAME     SAL
------------------- --------------- ----------
 1    KING      5000
 2    SCOTT     3000
 3    FORD      3000
 4    JONES     2975
 5    BLAKE     2850


✅ 分页:取第6~10行(Oracle风格分页)

SELECT * FROM (
    SELECT t.*, ROWNUM rn
    FROM (
        SELECT * FROM emp ORDER BY sal DESC
    ) t
) WHERE rn >=6 AND rn <=10;

# 输出的信息如下:
 EMPNO ENAME    JOB          MGR HIREDATE       SAL   COMM   DEPTNO    RN 
------ -------- --------- ------ ----------- ------ ------ -------- ----- 
  7782 CLARK    MANAGER     7839 1981/6/9      2450              10     6
  7499 ALLEN    SALESMAN    7698 1981/2/20     1600    300       30     7
  7844 TURNER   SALESMAN    7698 1981/9/8      1500              30     8
  7934 MILLER   CLERK       7782 1982/1/23     1300              10     9
  7521 WARD     SALESMAN    7698 1981/2/22     1250    500       30    10
5 rows fetched.


✅ 窗口函数 ROW_NUMBER()(推荐,不受ROWNUM限制)

如果需要稳定排序行号、复杂分页,优先用窗口函数 ROW_NUMBER(),分布式集群也支持:

SELECT 
    t.*,
    ROW_NUMBER() OVER(ORDER BY sal DESC) AS rn
FROM emp t;

# 输出的信息如下:
 EMPNO ENAME    JOB           MGR HIREDATE        SAL  COMM  DEPTNO    RN 
------ -------- ---------- ------ ------------ ------ ----- ------- ----- 
  7839 KING     PRESIDENT      -1 1981/11/17     5000            10     1
  7788 SCOTT    ANALYST      7566 1987/4/19      3000            20     2
  7902 FORD     ANALYST      7566 1981/12/3      3000            20     3
  7566 JONES    MANAGER      7839 1981/4/2       2975            20     4
  7698 BLAKE    MANAGER      7839 1981/5/1       2850            30     5
  7782 CLARK    MANAGER      7839 1981/6/9       2450            10     6
  7499 ALLEN    SALESMAN     7698 1981/2/20      1600   300      30     7
  7844 TURNER   SALESMAN     7698 1981/9/8       1500            30     8
  7934 MILLER   CLERK        7782 1982/1/23      1300            10     9
  7521 WARD     SALESMAN     7698 1981/2/22      1250   500      30    10
  7654 MARTIN   SALESMAN     7698 1981/9/28      1250  1400      30    11
  7876 ADAMS    CLERK        7788 1987/5/23      1100            20    12
  7900 JAMES    CLERK        7698 1981/12/3       950            30    13
  7369 SMITH    CLERK        7902 1980/12/17      800            20    14
14 rows fetched.


分页示例:

SELECT * FROM (
    SELECT 
        t.*,
        ROW_NUMBER() OVER(ORDER BY sal DESC) AS rn
    FROM emp t
) WHERE rn between 6 and 10;

# 输出的信息如下:
 EMPNO ENAME   JOB         MGR HIREDATE     SAL  COMM  DEPTNO   RN 
------ ------- --------- ----- ---------- ----- ----- ------- ---- 
  7782 CLARK   MANAGER    7839 1981/6/9    2450            10    6
  7499 ALLEN   SALESMAN   7698 1981/2/20   1600   300      30    7
  7844 TURNER  SALESMAN   7698 1981/9/8    1500            30    8
  7934 MILLER  CLERK      7782 1982/1/23   1300            10    9
  7521 WARD    SALESMAN   7698 1981/2/22   1250   500      30   10
5 rows fetched.


⚠️ 列存表(COLUMN表)ROWNUM 强限制(非常重要)

列存表使用 ROWNUM 约束极多:

  1. ROWNUM 只能和常量比较
  2. WHERE里不能用 >、<、>=、<=
  3. 等值比较只能等于常量1,ROWNUM=2 直接返回空
  4. 不能放在 OR 条件、不能参与运算、不能作为函数参数
  5. 不能在外连接的连接条件使用

👉 列存表不要用ROWNUM做分页,改用ROW_NUMBER窗口函数


✅ YashanDB 原生分页语法(推荐新写法,类似MySQL limit offset)

YashanDB 支持 FETCH / OFFSET,更简洁:

-- 取前5行
SELECT * FROM emp ORDER BY sal DESC FETCH FIRST 5 ROW ONLY;

# 输出的信息如下:
  EMPNO ENAME   JOB          MGR HIREDATE        SAL  COMM  DEPTNO 
------- ------- ---------- ----- ------------ ------ ----- ------- 
   7839 KING    PRESIDENT     -1 1981/11/17     5000            10
   7902 FORD    ANALYST     7566 1981/12/3      3000            20
   7788 SCOTT   ANALYST     7566 1987/4/19      3000            20
   7566 JONES   MANAGER     7839 1981/4/2       2975            20
   7698 BLAKE   MANAGER     7839 1981/5/1       2850            30
5 rows fetched.

-- 跳过3行,取4行(offset从0开始)
SELECT * FROM emp ORDER BY sal DESC OFFSET 3 ROW FETCH FIRST 4 ROW ONLY;

# 输出的信息如下:
 EMPNO ENAME   JOB          MGR HIREDATE     SAL   COMM  DEPTNO 
------ ------- --------- ------ ---------- ----- ------ ------- 
  7566 JONES   MANAGER     7839 1981/4/2    2975             20
  7698 BLAKE   MANAGER     7839 1981/5/1    2850             30
  7782 CLARK   MANAGER     7839 1981/6/9    2450             10
  7499 ALLEN   SALESMAN    7698 1981/2/20   1600    300      30
4 rows fetched.


📌 ROWNUM常见错误汇总

  1. WHERE ROWNUM = 2 → 空结果 ✘
  2. WHERE ROWNUM > 1 → 空结果 ✘
  3. WHERE ROWNUM <=10 ORDER BY xxx → 行号是排序之前分配,不是排序后的行号 ✘
  4. 分布式集群直接写ROWNUM → 语法报错 ✘
  5. 列存表 ROWNUM <=10 → 不支持 ✘


📌 ROWNUM vs ROW_NUMBER() vs FETCH

image.png


相关文章
|
23天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9415 30
|
9天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
8天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
668 1
|
22天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2494 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
4天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型全解析:核心原理拆解,性能实战测评与落地部署教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为System One Model(系统一模型),对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
428 0
|
3天前
|
存储 缓存 测试技术
QWT 3D 模块重构记:旧渲染管线改进介绍及实时瀑布图示例
QWT 3D模块完成重大重构:解耦窗口与图形(Plot+Item),摒弃OpenGL 1.x固定管线,迁至Core Profile着色器渲染;支持多图元同场景叠加,并以实时3D瀑布图验证——滑动窗口、固定色域、64帧×256点达61fps。兼容Qt 5.12+/6,LGPL协议。
163 120
|
15天前
|
Windows
【保姆级】.NET Framework 3.5离线安装教程(2026最新实测)
.NET Framework 3.5是微软经典运行库,专为兼容老软件、老游戏设计。Win7自带,Win10/11需手动启用(在线或离线安装)。它与4.x系列并存不冲突,缺它会导致“找不到组件”报错。本文详解两种安装方式及常见问题解决,小白也能轻松上手。(239字)
1934 0
|
11天前
|
人工智能 Linux Windows
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面
千问办公(QwenWork)是阿里云推出的AI智能办公平台,支持网页端直接使用及Windows/Mac/Linux客户端下载。提供PPT生成、财报分析、网页搭建等AI功能,个人版免费,企业版198元/席/月。详情见官网qwenwork.cn或阿里云产品页。
1212 0
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面