oracle数据排序后获取前几行数据的写法(rownum、fetch方式)

目录
  • 0. 前言
  • 1. 先说结论
  • 2. 举个例子
    • 1. 数据准备
    • 2. 使用rownum方式获取前几行数据
    • 3. 使用fetch方式获取前几行数据(推荐)
  • 总结

0. 前言

无论在工作中,还是学习中,都会出现这样子的需求,对某张表进行了排序(按时间排序也好,其他字段排序也罢),然后获取前x行的数据,由于工作中经常出现,因此写篇文章记录一下多种写法。

1. 先说结论

  1. 第一种使用rownum方式,在oracle数据库中,查询出来的数据,可以通过rownum(行数)来指定具体第几行数据,但需要注意以下几点:

    1. 查询出来的数据,第一行是 rownum=1,并不是从0开始的。
    2. 用rownum方式获取数据,必须要有一层嵌套select语句,这也是此方法最大的缺点,导致sql多一层。
    3. 常用语法: select * from ( select * from people order by id desc ) where rownum = 1
  2. 第二种使用fetch方式,其还可以用于分页查询使用,fetch使用需要注意如下几点:
    1. oracle版本得12以上,否则无法使用了。
    2. 使用格式: OFFSET n ROWS FETCH NEXT m ROWS ONLY 从第n行开始,往后取m行(注 不包括第n行数据)
    3. 也可以简写为 FETCH NEXT m ROWS ONLY 从头开始往后取m行
    4. 无需多一层select嵌套,可以直接写在sql最后

2. 举个例子

1. 数据准备

在之前所说的,在线oracle学习网站中准备好数据如下:

CREATE TABLE people  (
  id varchar2(10),
  name varchar2(10),
  sex varchar2(10)
);
INSERT INTO people VALUES ('1', '小明', '男');
INSERT INTO people VALUES ('2', '小红', '女');
INSERT INTO people VALUES ('3', '小黄', '男');
INSERT INTO people VALUES ('4', '小紫', '男');
INSERT INTO people VALUES ('5', '小绿', '男');
INSERT INTO people VALUES ('6', '小白', '男');
INSERT INTO people VALUES ('7', '大强', '男');
INSERT INTO people VALUES ('8', '大青', '男');

这里将id类比时间字段,一般查询根据时间进行倒序:

select * from people
order by id desc

2. 使用rownum方式获取前几行数据

在oracle数据库中,查询出来的数据,可以通过rownum(行数)来指定具体第几行数据,但需要注意以下几点

  • 查询出来的数据,第一行是 rownum=1,并不是从0开始的。
  • 用rownum方式获取数据,必须要有一层嵌套select语句,这也是此方法最大的缺点,导致sql多一层。

倒序查询之后,获取第一行数据:

select * from (
  select * from people
  order by id desc
)
where rownum = 1

倒序查询之后,获取前4行数据:

select * from (
  select * from people
  order by id desc
)
where rownum <= 4

如果不使用嵌套select,则会报错语法错误:

3. 使用fetch方式获取前几行数据(推荐)

fetch方式除了获取前几行数据,还有另一个作用,就是进行分页的时候使用。

fetch使用需要注意如下几点:

  1. oracle版本得12以上,因此上面的在线学习oracle网页无法使用了。
  2. 使用格式: OFFSET n ROWS FETCH NEXT m ROWS ONLY 从第n行开始,往后取m行(注 不包括第n行数据)
  3. 也可以简写为 FETCH NEXT m ROWS ONLY 从头开始往后取m行
  4. 无需多一层select嵌套,可以直接写在sql最后

倒序查询之后,获取第一行数据:

select * from people
order by id desc
fetch next 1 rows only

倒序查询之后,获取前4行数据:

select * from people
order by id desc
fetch next 4 rows only

fetch用于分页,从第n行后,取m返回结果集

select * from people
order by id desc
OFFSET n ROWS FETCH NEXT m ROWS ONLY

总结

到此这篇关于oracle数据排序后获取前几行数据的写法(rownum、fetch方式)的文章就介绍到这了,更多相关oracle数据排序后获取数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Oracle数据库中ORDER BY排序和查询按IN条件的顺序输出

    ORDER BY非稳定的排序 提一个问题: oracle在order by 排序时,是稳定排序算法吗? 发现用一个type进行排序后,做分页查询,第一页的数据和第二页的数据有重复 怀疑是order by 时,两次排列的顺序不一致 看到业务描述的问题可以得到的结论order by排序不稳定,还有第一个印象就是,type肯定是不唯一的,并且没有索引吧. 这里先科普下排序的稳定性,举个最简单的例子,1,2,3,1,4,5 排序 排序的结果是1,1,2,3,4,5,这时候观察这个1,如果第一个1还是排序

  • Oracle数据库中对null值的排序及mull与空字符串的区别

    order by排序之null值处理方法 在对业务数据排序时候,发现有些字段的记录是null值,这时排序便出现了有违我们使用习惯的数据大小顺序问题.在Oracle中规定,在Order by排序时缺省认为null是最大值,所以如果是ASC升序则被排在最后,而DESC降序则排在最前.所以,为何分析数据的直观性方便性,我们需要对null的记录值进行相应处理. 这是四种oracle排序中NULL值处理的方法: 1.使用nvl函数 语法:Nvl(expr1, expr2)     若EXPR1是NULL,

  • oracle数据库排序后如何获取第一条数据

    目录 oracle排序后如何获取第一条数据 场景 实现 oracle分组后获取每组数据第一条数据 总结 oracle排序后如何获取第一条数据 场景 想要获取下列sql的数据的第一条 select NEXT_FOLLOWUP_DATE from PH_CHILD_HEALTH_EXAM where person_info_id = '3afc119ab460497d85f59b1e135ea6b1' order by followup_Visit_Date desc 实现 select NEXT_

  • Oracle中简单查询、限定查询、数据排序SQL语句范例和详细注解

    一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统.ANSI(美国国家标准学会)声称,SQL是关系数据库管理系统的标准语言. Oracle数据库之所以发展的很好,主要也是因为Oracle是全世界最早采用SQL语句的数据库产品. SQL功能强大,概括起来,它可以分成以下几组: 复制代码 代码如下: DML(Data Manipulation Language) 数据操作语言,用于

  • oracle数据排序后获取前几行数据的写法(rownum、fetch方式)

    目录 0. 前言 1. 先说结论 2. 举个例子 1. 数据准备 2. 使用rownum方式获取前几行数据 3. 使用fetch方式获取前几行数据(推荐) 总结 0. 前言 无论在工作中,还是学习中,都会出现这样子的需求,对某张表进行了排序(按时间排序也好,其他字段排序也罢),然后获取前x行的数据,由于工作中经常出现,因此写篇文章记录一下多种写法. 1. 先说结论 第一种使用rownum方式,在oracle数据库中,查询出来的数据,可以通过rownum(行数)来指定具体第几行数据,但需要注意以下

  • SQL中limit函数语法与用法(MYSQL获取限制某行数据)

    1.limit函数的语法和用法 (1)常用且简单的语法和用法 ①语法:limit n 即limit <参数> 具体语法:select <字段1>,...,<字段n> from <表名> (where <条件> order by <字段1>...<字段n> asc|desc) limit n 说明:括号内的语句可省略 参数说明: n:为阿拉伯数字,表示前n行. ②用法:用于获取前n行数据. (2)另一种(两个参数)语法和用法

  • sql server删除前1000行数据的方法实例

    近日,sql数据库入门学习群有朋友问到,利用sql如何删除表格的前1000行数据,是否可以实现? 如果是oracle数据库管理软件,实现起来相对简单多了 delete from 表名 where rownum<=1000; 那sql server数据库管理软件呢? sql server里没有rownum功能,小编尝试用select top 先查询看下结果集,select * from 表名: delete from 表名 where 条码 in (select top 10 条码 from 表名

  • 使用list stream:对List中的对象先进行排序再获取前n个对象

    目录 list stream:对List中的对象先进行排序再获取前n个对象 接下来我们就来看一下这个方法 通过自定义一个的对象比较方法来进行排序 将上面实例中的TestUser对象贴出来 对List集合中的对象进行按某个属性排序 这里先举一个简单的例子 list stream:对List中的对象先进行排序再获取前n个对象 开发中我们经常会对一个List中的对象进行排序,使用排序后的结果来进行计算或使用,今天来介绍一个非常简洁的对List中对象进行排序,排序后的结果我们只获取前N个对象 接下来我们

  • R语言-如何读取前n行数据

    通常我们读取文件时都会读取全部的文件然后再进行操作,但是当读取的数据量很大是读取的时间会很长,而且占用RAM,对于写测试代码有点不方便. 所以只读取前n行数据是一个挺不错的函数 ##file:读取文件路径 ##n:读取的前n行 ##header:是否有标题行 readfile<-function(file, n=1000, header=T){ pt <- file(file, "r") name <- NULL if(header){ name <- strs

  • pandas分组排序 如何获取第二大的数据

    Python用来做数据分析很方便,网上很多关于找数据中第二大的方法,但是大多数都是关于SQL的,于是我挑战一下用Python来做这件事(主要是SQL写的不好>_<),上代码. 1.数据我是自己编的 在实际工作中应该从数据库中导入数据,如何从数据库导出数据,我之后会补充. import pandas as pd df = pd.DataFrame([ {"class": 1, "name": "aa", "english&qu

  • sql添加数据后返回受影响行数据

    Inserted 表中的行是触发器表中新行的副本. 语法 返回所有列 INSERT INTO [tableName] ([columnName1],[columnNameN],...) OUTPUT inserted.* VALUES ('value1','value2',...) 返回指定列 INSERT INTO [tableName] ([columnName1],[columnNameN],...) OUTPUT inserted.[columnName] VALUES ('value1

  • MySql中取前几行数据使用limit来完成

    在mysql中是没有top关键字的,在mysql中可以用limit来完成功能. order by id desc limit 10 按照id的倒序排序 取出前10条 order by id desc limit 0,10 按照id的倒序排序 取出前10条 order by id limit 5,10 按照id的正序排序 从第5条开始取10条 复制代码 代码如下: SELECT cat_id FROM shop_goods_type order by cat_id desc limit 1

  • php更新mysql后获取影响的行数发生异常解决方法

    从manual上知道了mysql_affected_rows函数当UPDATE前后的数据一样时会返回异常值, 下面有个方便的解决办法,从官方munual上看到 bdobrica at gmail dot com 留言的: As a solution to the problem pointed in the post reffering to mysql_affected_rows() returning 0 when you are making an update query and the

  • php更新mysql后获取改变行数的方法

    本文实例讲述了php更新mysql后获取改变行数的方法.分享给大家供大家参考.具体分析如下: 一个php更新mysql后获取改变的行数,在php中提供mysql函数来获取最后执行查询所影响的记录数:mysql_affected_rows(), 返回最近一次与 连接句柄 关联的 INSERT,UPDATE 或 DELETE 查询所影响的记录行数.FOUND_ROWS() : select ROW_COUNT():update delete insert. 下面就是文章的主要内容描述,代码如下: 复

随机推荐