oracle 没有 limit用法,但有伪列 rownum

本文介绍了在Oracle数据库中实现分页查询的方法。利用ROWNUM特性,提供了两种实现方式:一是通过子查询结合ROWNUM筛选指定范围的数据;二是采用MINUS操作符排除前几条记录来达到分页效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在Oracle中不支持select top n语句,所以需要用伪列 rownum,用法如下:

select p.id,p.shortname  from (select * from prj_project order by id) p  where rownum<3 


oracle 有一个隐藏的字段是 rownum(不同于mysql,mysql 用limit 1,10;//从第一行开始 取10条

方法一:select * from (select t.*,rownum rn from prj_project  t) nn where nn.rn>9 and nn.rn<101


方法二:select * from prj_project where rownum<101
minus
select * from prj_project where rownum<11
### Oracle SQL 中实现 `LIMIT` 功能的方法 在 Oracle 数据库中,虽然没有直接提供 MySQL 的 `LIMIT` 关键字,但是可以使用其他方法来达到相同的效果。主要通过 `ROWNUM` 或者更现代的方式如 `FETCH FIRST n ROWS ONLY` 来限制查询结果的数量。 #### 使用 ROWNUM 实现 LIMIT 功能 由于 `ROWNUM` 是由 Oracle 自动分配给每一行的一个伪列,在查询时可以根据这个值来进行过滤[^1]: ```sql SELECT * FROM table_name WHERE ROWNUM <= N; ``` 这里 `N` 表示想要获取的最大行数。需要注意的是,如果尝试像下面这样组合条件,则不会得到预期的结果,因为 `ROWNUM` 只会在满足第一个条件之后才被赋值: ```sql SELECT * FROM CLEAR WHERE ROWNUM > 99 AND ROWNUM < 101; -- 这种写法是错误的 ``` 为了正确地模拟 `LIMIT M,N` (即跳过前M行并取接下来的N行),通常的做法如下所示[^2]: ```sql SELECT * FROM ( SELECT a.*, ROWNUM rnum FROM ( SELECT * FROM table_name ORDER BY some_column ) a WHERE ROWNUM <= start_row + num_rows - 1 ) WHERE rnum >= start_row; ``` 其中 `start_row` 和 `num_rows` 分别代表起始位置和要取出的数据量。 #### 使用 FETCH FIRST 实现 LIMIT 功能 对于较新的版本(Oracle 12c及以上),可以直接利用标准SQL语法中的 `OFFSET ... FETCH NEXT/FIRST` 子句来简化分页操作[^3]: ```sql SELECT column_list FROM table_name ORDER BY sort_expression OFFSET offset_value ROWS FETCH NEXT fetch_count ROWS ONLY; ``` 例如,若要在文章表中按 ID 排序后提取第 5 到第 14 行之间的数据,可执行以下语句: ```sql SELECT a_id, a_title, a_author, aid, a_time, areadtime, sid FROM article ORDER BY a_id OFFSET 4 ROWS FETCH NEXT 10 ROWS ONLY; ``` 这种方法不仅更加直观易懂,而且性能上也有所优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值