Oracle查询前n条、后n条记录

本文介绍如何使用SQL的ROWNUM关键字来查询Persons表中的前n条记录以及后n条记录,并提供了实例代码。此外,文章还提到了TOP子句在不同数据库系统中的语法差异及应用,包括SQLServer、MySQL和Oracle。


1.前n条:

查询Persons表中的前5条记录,用ROWNUM关键字

例:SELECT * FROM t_Persons WHERE ROWNUM <= 5 



2.后n条:

例:SELECT * FROM (SELECT * FROM t_Persons ORDER BY time DESC) WHERE ROWNUM < 10;

time是我表中的一个字段,是插入记录的当前时间






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

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

参考文献:http://www.w3school.com.cn/sql/sql_top.asp

1.TOP 子句

TOP 子句用于规定要返回的记录的数目。
对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。
注释:并非所有的数据库系统都支持 TOP 子句。

1.1SQL Server 的语法:SQL Server中使用top关键字

SELECT TOP number|percent column_name(s) FROM table_name  

可以参考我以前的博客:sql查询选择表中从10到15的记录

1.2MySQL 语法:MySQL使用limit关键字

SELECT column_name(s) FROM table_name LIMIT number  

例子

SELECT * FROM Persons LIMIT 5  

1.3Oracle 语法:Oracle中使用 ROWNUM关键字

SELECT column_name(s) FROM table_name WHERE ROWNUM <= number   

例子1:查询Persons表中的前5条记录

SELECT * FROM Persons WHERE ROWNUM <= 5  

例子2:查询procedure_no的最大值

SELECT  procedure_no  FROM (SELECT  *  FROM process_card_procedure where process_card_id=421 order by cast(procedure_no as int) desc) where rownum<=1   

2.总结

top字句结合order by会很有用,比如查询最大值之类的。





Select * from (select * from tablename orderby time desc) where rownum < 10;

time是我表中的一个字段,是插入记录的当前时间
Oracle数据库中获取第一记录的方法有多种,具体选择取决于实际需求和版本支持。以下是几种常见的实现方式: ### 使用 `ROWNUM` 伪列 在早期的Oracle版本中,`ROWNUM` 是一个常用的伪列,它可以在查询结果返回之为每一行分配一个序号。通过结合 `WHERE` 子句可以筛选出第一记录。例如: ```sql SELECT * FROM your_table WHERE ROWNUM = 1; ``` 需要注意的是,`ROWNUM` 的分配是在排序之完成的,因此如果希望根据特定顺序获取第一记录,应该先对数据进行排序,再应用 `ROWNUM` 件。可以通过子查询来实现这一点: ```sql SELECT * FROM ( SELECT * FROM your_table ORDER BY some_column ) WHERE ROWNUM = 1; ``` ### 使用 `FETCH FIRST` 子句(适用于 Oracle 12c 及更高版本) 从 Oracle 12c 开始,引入了 `FETCH FIRST` 子句,简化了获取 N 记录的操作。要获取第一记录,可以使用以下语法: ```sql SELECT * FROM your_table ORDER BY some_column FETCH FIRST 1 ROWS ONLY; ``` 这种方式更加直观,并且能够确保按照指定的排序规则获取第一记录。 ### 分组查询取每组的第一记录 如果需要在分组查询中获取每组的第一记录,可以采用窗口函数或者子查询的方式。例如,假设有一个表 `T_USER` 并且希望按某个字段分组后取每组的第一记录,可以使用如下方法: ```sql SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY group_column ORDER BY some_column) AS rn FROM T_USER t ) WHERE rn = 1; ``` 此方法利用了 `ROW_NUMBER()` 窗口函数为每个分组内的行分配一个唯一的编号,然后筛选出编号为 1 的行以获得每组的第一记录。 ### 随机获取一记录 如果目标是从表中随机选取一记录,可以借助 `DBMS_RANDOM` 包实现。例如: ```sql SELECT * FROM ( SELECT * FROM T_USER ORDER BY DBMS_RANDOM.RANDOM() ) WHERE ROWNUM = 1; ``` 这种方法首先将表中的所有记录随机排序,然后通过 `ROWNUM` 获取第一记录。 ### 总结 - 对于简单的获取单记录的需求,可以直接使用 `ROWNUM` 或者 `FETCH FIRST` 子句。 - 如果涉及分组查询并需要获取每组的第一记录,则推荐使用窗口函数。 - 对于随机选取记录的情况,可以结合 `DBMS_RANDOM` 和 `ROWNUM` 实现。 以上方法均可以根据实际场景灵活选用[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值