Oracle数据库rownum和row_number的不同点
在Oracle数据库中,`ROWNUM` 和 `ROW_NUMBER()` 是两个不同的概念,它们在处理结果集的排序和分页方面有着显著的区别。 `ROWNUM` 是Oracle数据库中的一个伪列,它在查询执行的过程中动态生成。当查询执行时,`ROWNUM` 会为每一行分配一个唯一的数字,从1开始递增。然而,`ROWNUM` 的一个关键限制是它不能用于筛选特定数值之后的行,比如 `WHERE ROWNUM > n` 这样的条件通常不会按预期工作,因为如果 `ROWNUM` 不等于1,那么该行就不会被选中。因此,如果你想选择第n行后的所有行,你需要使用子查询来实现: ```sql SELECT * FROM ( SELECT * FROM emp ORDER BY sal DESC ) WHERE ROWNUM <= n; ``` 相比之下,`ROW_NUMBER()` 是一种窗口函数(分析函数),它在SQL标准中定义,Oracle 10g及以上版本开始支持。`ROW_NUMBER()` 可以根据指定的排序规则为每一行分配一个唯一的序号,同样从1开始。与 `ROWNUM` 不同,`ROW_NUMBER()` 可以在 `WHERE` 子句中配合使用,允许我们更灵活地筛选特定行范围,例如选取第n到第m行的数据: ```sql SELECT * FROM ( SELECT ename, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) AS num FROM emp ) WHERE num BETWEEN n AND m; ``` `ROW_NUMBER()` 还允许在 `OVER` 子句中添加 `PARTITION BY` 子句,这使得我们可以为每个分区内的行独立编号,从而在分组后进行排序和分页操作。 总结一下 `ROWNUM` 和 `ROW_NUMBER()` 的主要区别: 1. `ROWNUM` 是Oracle特有的伪列,而 `ROW_NUMBER()` 是SQL标准的窗口函数。 2. `ROWNUM` 不能直接用于选取第n行之后的记录,而 `ROW_NUMBER()` 可以。 3. `ROW_NUMBER()` 支持 `OVER` 子句,可以进行复杂的排序和分组操作,`ROWNUM` 则不支持。 4. `ROWNUM` 的分配是在查询开始时完成的,而 `ROW_NUMBER()` 的分配是在查询处理过程中,根据指定的排序和分区条件动态生成的。 在实际应用中,如果需要进行复杂的排序和分页,`ROW_NUMBER()` 通常更为灵活和强大。但在早期的Oracle版本中,由于 `ROWNUM` 的性能优势,它在简单的分页查询中被广泛使用。随着技术的发展,`ROW_NUMBER()` 在功能和灵活性上的优势使其成为了更优的选择。
- 粉丝: 20
- 资源: 954
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 一款由Java写的射击游戏.zip算法资源
- 一些java的小游戏项目,贪吃蛇啥的.zip用户手册
- 在线实时的斗兽棋游戏,时间赶,粗暴的使用jQuery + websoket 实现实时H5对战游戏 + java.zip课程设计
- HTML5酒店网站模板.zip
- 基于SpringBoot开发的支付系统(包括支付宝支付,微信支付,订单系统).zip
- C基于Qt的学生成绩管理系统.zip毕业设计
- 基于深度卷积神经网络(CNN)模型的图像着色研究与应用系统实现
- Java Web实验报告五:基于JSP的留言本
- Java Web实验报告四:基于AJAX的级联下拉菜单
- springboot洗衣店订单管理系统(代码+数据库+LW)