介绍一下 Oracle中的 ROWNUM 和 ROW_NUMBER OVER

目录

前言

一、ROWNUM:结果集的行号伪列

[1. 基本特性](#1. 基本特性)

[2. 常用场景:限制返回的行数](#2. 常用场景:限制返回的行数)

[3. 分页的正确写法(结合 ROWNUM)](#3. 分页的正确写法(结合 ROWNUM))

[4. ROWNUM 的局限](#4. ROWNUM 的局限)

[二、OVER 与 ROW_NUMBER():窗口函数中的行号](#二、OVER 与 ROW_NUMBER():窗口函数中的行号)

[1. 基本语法](#1. 基本语法)

[2. 典型例子:各部门按工资排序,从高到低编号](#2. 典型例子:各部门按工资排序,从高到低编号)

[3. 与 ROWNUM 的核心区别](#3. 与 ROWNUM 的核心区别)

三、其它

[OVER 英文 在这里如何解析](#OVER 英文 在这里如何解析)

[PARTITION BY 对应的英文是什么](#PARTITION BY 对应的英文是什么)

[什么叫 分析函数,为什又叫窗口函数](#什么叫 分析函数,为什又叫窗口函数)

[为什么 ,WHERE ROWNUM > 1 永远不会返回任何行](#为什么 ,WHERE ROWNUM > 1 永远不会返回任何行)

[Oracle 中 PARTITION BY 的作用是什么](#Oracle 中 PARTITION BY 的作用是什么)


================

前言

在 Oracle 数据库中,ROWNUM 和 OVER 是用于不同目的但经常被混淆的两个概念。简单来说:

  • ROWNUM 是一个伪列,它在查询结果集返回时,为每一行分配一个唯一的、递增的行号。

  • OVER 是分析函数(窗口函数) 的一部分,它与 ROW_NUMBER()、RANK() 等函数配合,在保留所有原始行的基础上,进行分组、排序和编号。

下面详细拆解这两个概念。

================

一、ROWNUM:结果集的行号伪列

1. 基本特性

  • ROWNUM 是 Oracle 特有的,在查询返回行的过程中动态生成。

  • 第一行 ROWNUM = 1,第二行 ROWNUM = 2,依次类推。

  • 关键点 :ROWNUM 是在 WHERE 条件过滤之后、ORDER BY 排序之前 分配的。也就是说,如果用了 ORDER BY,排序会改变行的物理顺序,但 ROWNUM 仍然是按照原始获取顺序分配的(除非使用子查询)。

2. 常用场景:限制返回的行数

sql 复制代码
-- 返回前 5 行(不等同于排序后的前 5)
SELECT * FROM employees WHERE ROWNUM <= 5;

注意 :WHERE ROWNUM > 1 永远不会返回任何行,因为第一行被过滤后,第二行不会变成第一行(ROWNUM 始终从 1 开始)。所以要实现真正的分页,需要嵌套子查询。

3. 分页的正确写法(结合 ROWNUM)

sql 复制代码
SELECT * FROM (
    SELECT e.*, ROWNUM rn FROM (
        SELECT * FROM employees ORDER BY salary DESC
    ) e WHERE ROWNUM <= 20
) WHERE rn > 10;

4. ROWNUM 的局限

  • 无法直接实现"每组内排名"。

  • 与 ORDER BY 同时使用时容易出错(因为先分配 ROWNUM 再排序)。

  • 属于 Oracle 特有,不兼容其他数据库(如 PostgreSQL、MySQL 用 LIMIT)。

二、OVER 与 ROW_NUMBER():窗口函数中的行号

OVER 是分析函数的子句,用于定义窗口 (即数据分组和排序的范围)。最常用的与行号相关的函数是 ROW_NUMBER()。

1. 基本语法

sql 复制代码
ROW_NUMBER() OVER ( [PARTITION BY 列1, 列2...] ORDER BY 列3 [ASC|DESC] )
  • PARTITION BY:可选,将数据分成独立的分组(如部门、类别)。

  • ORDER BY:在每个组内指定排序规则。

  • ROW_NUMBER():为每个组内的行分配一个唯一的、从1开始的连续编号。

=====

2. 典型例子:各部门按工资排序,从高到低编号

sql 复制代码
SELECT 
    employee_id, 
    department_id, 
    salary,
    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rn
FROM employees;

结果:每个部门内部,工资最高的人 rn=1,次高 rn=2,等等。

===

3. 与 ROWNUM 的核心区别

特性 ROWNUM ROW_NUMBER() OVER
分配时机 在 WHERE 后、ORDER BY 前 在整个查询的最后阶段(SELECT 时计算)
分组支持 无 支持 PARTITION BY 分组内部编号
是否唯一 整个结果集唯一且递增 每个分组内唯一,不同分组编号独立
顺序控制 受限于执行顺序,容易出错 通过 ORDER BY 明确控制
标准兼容 Oracle 专有 SQL:2003 标准,多数数据库支持

====

三、其它

OVER 英文 在这里如何解析

====

PARTITION BY 对应的英文是什么

====

什么叫 分析函数,为什又叫窗口函数

====

为什么 ,WHERE ROWNUM > 1 永远不会返回任何行



====

Oracle 中 PARTITION BY 的作用是什么

====

相关推荐
阳光九叶草LXGZXJ3 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
字节渡客4 小时前
Redis键明明过期了,业务还在读到旧数据
数据库·redis·spring
OnlineProxy6 小时前
亚马逊多账号运营:如何在规避“关联封号”风险的同时实现电商规模化扩张
服务器·数据库·redis
辻弋2017 小时前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
可乐鸡翅yeah_8 小时前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
石头麻辣鱼8 小时前
Bamboo 调度系统 OceanBase 适配实战:存储过程迁移踩过的三个大坑
数据库
龙亘川9 小时前
数智驱动民政升级 精准守护民生保障
大数据·数据库·人工智能
念何架构之路9 小时前
zap扩展生态与总结
java·前端·数据库
晚安日记wanna10 小时前
MySQL 回表为什么这么慢?5 种优化手段逐个拆解
数据库·mysql·性能优化
第七页独白10 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库