Oracle Fetch子句

作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146

在本教程中,将学习如何使用Oracle FETCH子句来限制查询返回的行数。

Oracle FETCH子句简介

一些RDBMS(如MySQLPostgreSQL)使用LIMIT子句来检索查询生成的一部分行记录。

请参阅示例数据库中的产品(products)和库存(inventories)表。两个表的结构和关系如下所示 -

以下查询使用LIMIT子句获得库存量最高的前5个产品:

SELECT
product_name,
quantity
FROM
inventories
INNER JOIN products
USING(product_id)
ORDER BY
quantity DESC
LIMIT 5;
SQL

在此示例中,ORDER BY子句按降序对库存数量(quantity)进行排序,LIMIT子句仅返回库存数量最多的前5个产品。

Oracle数据库标准中没有LIMIT子句。 然而,自12c发布以来,它提供了一个类似但更灵活的子句,即行限制子句。

通过使用行限制子句,重写上面的LIMIT子句的查询,如下所示:

SELECT
product_name,
quantity
FROM
inventories
INNER JOIN products
USING(product_id)
ORDER BY
quantity DESC
FETCH NEXT 5 ROWS ONLY;
SQL

注意:上面查询仅能在Orace 12c以上版本中运行。

如果使用的是Oracle 11g及以下版本的,请参考以下语句 -

SELECT
product_name, quantity
FROM
inventories
INNER JOIN products
USING(product_id)
WHERE rownum<=5
ORDER BY quantity DESC;
SQL

执行上面查询语句,得到以下结果 -

在这个语句中,行限制子句是:

FETCH NEXT 5 ROWS ONLY
SQL

与上面使用LIMIT子句的语句类似,行限制子句返回库存量最高的前5个产品。

Oracle FETCH子句语法

以下说明了行限制子句的语法:

[ OFFSET offset ROWS]
FETCH NEXT [ row_count | percent PERCENT ] ROWS [ ONLY | WITH TIES ]
SQL

OFFSET子句

OFFSET子句指定在行限制开始之前要跳过行数。OFFSET子句是可选的。 如果跳过它,则偏移量为0,行限制从第一行开始计算。

偏移量必须是一个数字或一个表达式,其值为一个数字。偏移量遵守以下规则:

  • 如果偏移量是负值,则将其视为0
  • 如果偏移量为NULL或大于查询返回的行数,则不返回任何行。
  • 如果偏移量包含一个分数,则分数部分被截断。

FETCH子句

FETCH子句指定要返回的行数或百分比。

为了语义清晰的目的,您可以使用关键字ROW而不是ROWSFIRST而不是NEXT。 例如,以下子句的行为和产生的结果相同:

FETCH NEXT 1 ROWS
FETCH FIRST 1 ROW
SQL

ONLY | WITH TIES选项

仅返回FETCH NEXT(或FIRST)后的行数或行数的百分比。

WITH TIES返回与最后一行相同的排序键。请注意,如果使用WITH TIES,则必须在查询中指定一个ORDER BY子句。如果不这样做,查询将不会返回额外的行。

Oracle FETCH子句的例子

1. 获取前N行记录的示例

以下语句返回库存量最高的前10个产品:

-- 以下查询语句仅能在Oracle 12c以上版本执行
SELECT
product_name,
quantity
FROM
inventories
INNER JOIN products
USING(product_id)
ORDER BY
quantity DESC
FETCH NEXT 5 ROWS ONLY;
SQL

执行上面查询语句,得到以下结果 -

2. WITH TIES示例

以下查询使用WITH TIES选项的行限制子句:

-- 以下查询语句仅能在Oracle 12c以上版本执行
SELECT
product_name,
quantity
FROM
inventories
INNER JOIN products
USING(product_id)
ORDER BY
quantity DESC
FETCH NEXT 10 ROWS WITH TIES;
SQL

执行上面示例查询语句,得到以下结果 -

即使查询请求了10行数据,因为它具有WITH TIES选项,查询还返回了另外两行。 请注意,这两个附加行在quantity列的值与第10quantity列的值相同。

3. 以百分比限制返回行的示例

以下查询返回库存量最高的前1%的产品:

-- 以下查询语句仅能在Oracle 12c以上版本执行
SELECT
product_name,
quantity
FROM
inventories
INNER JOIN products
USING(product_id)
ORDER BY
quantity DESC
FETCH FIRST 1 PERCENT ROWS ONLY;
SQL

执行上面示例查询语句,得到以下结果 -

库存(inventories)表总共有1112行,因此,1112中的1%11.1,四舍五入为12(行)。

4. OFFSET示例

以下查询将跳过库存量最高的前10个产品,并返回接下来的10个产品:

-- 以下查询语句仅能在Oracle 12c以上版本执行
SELECT
product_name,
quantity
FROM
inventories
INNER JOIN products
USING(product_id)
ORDER BY
quantity DESC
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
SQL

注意:这个功能可以用于分页的实现。

执行上面查询语句,得到以下结果 -

在本教程中,您已学习如何使用Oracle FETCH子句来限制查询返回的行。

Oracle Fetch子句的更多相关文章

  1. Oracle Like子句

    Oracle Like子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,您将学习如何使用Oracle LIKE运算符来测试列中的值是否与指定 ...

  2. Oracle Between子句

    Oracle Between子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,您将学习如何使用Oracle BETWEEN运算符来选择值在一 ...

  3. Oracle In子句

    Oracle In子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,您将学习如何使用Oracle IN运算符来确定值是否与列表或子查询中的任 ...

  4. Oracle Or子句

    Oracle Or子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,我们来学习如何使用Oracle OR运算符来组合两个或更多的布尔表达式. ...

  5. Oracle And子句

    Oracle And子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,将学习如何使用Oracle AND运算符来组合两个或更多的布尔表达式. ...

  6. Oracle Where子句

    Oracle Where子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,将学习如何使用Oracle WHERE子句来指定过滤的条件返回符合 ...

  7. SQL Server2012 Offset Fetch子句 分页查询

    在本教程中,将学习如何使用SQL Server OFFSET FETCH子句来限制查询返回的行数.OFFSET和FETCH子句是ORDER BY子句的选项. 它们用于限制查询返回的行数.以下是OFFS ...

  8. oracle排序子句的特殊写法与ORA-01785错误

    刚刚写的SQL语句在执行的时候报[ORA-01785: ORDER BY item must be the number of a SELECT-list expression]错误,于是自己百度了一 ...

  9. oracle SELECT子句中避免使用 ‘ * ‘

    当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法. 不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所 ...

随机推荐

  1. [Web 前端] 025 js 的对象、数组和数学对象

    1. Javascript 对象 1.1 创建对象 1.1.1 使用原始的方式创建内置对象 var myObject = new Object(); myObject.name = "lij ...

  2. python之optparse

    Python有两个内建的模块用来处理命令行参数 一个是getopt只能简单处理命令行参数 一个是optparse,功能更强大,而且易于使用,可以方便地生成标准的,符合Unix/Posix规范的命令行说 ...

  3. PHP批量导入excell表格到mysql数据库

    PHP批量导入excell表格到mysql数据库,本人通过亲自测试,在这里分享给大家 1,下载 php  excell类库 网上搜索可以下载,这里不写地址 2,建html文件 <form met ...

  4. Windows 环境下安装redis 及其PHP Redis扩展

    1.安装Redis (1)这里选择在github官网上下载Redis,地址:Redis下载地址 下载压缩包(如下图),并解压到本地目录,我放在D:\redis (2)验证Redis安装是否成功打开命令 ...

  5. 基于Red5与ffmpeg实现rtmp处理NVR或摄像头的监控视频处理方案

    背景 各大监控视频平台厂商与外对接均是基于IE的OCX插件方式提供实时视频查看.历史视频回放与历史视频下载.在h5已大行其道的当下,基于IE的OCX插件方式已满足不了广大客户的实际需求,因此需要一个兼 ...

  6. python multiprocessing模块

    python multiprocessing模块 原文地址 multiprocessing multiprocessing支持子进程.通信和共享数据.执行不同形式的同步,提供了Process.Queu ...

  7. 连接数据库出现错误:1045-Access denied for user 'root'@'localhost'解决方法

    Navicat for MySQL 链接: https://pan.baidu.com/s/1slwQxVB 密码: r737 1.出现这个问题的原因之一是权限的问题,也就是说你的电脑可能没有权限访问 ...

  8. python基础操作---list

    #coding:utf-8 list1 = ['physics', 'chemistry', 1997, 2000]; list2 = [1, 2, 3, 4, 5 ]; list3 = [" ...

  9. PAT Basic 1037 在霍格沃茨找零钱 (20 分)

    如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.”现在,给定 ...

  10. 斯托克斯公式(Stokes' theorem)

    参考:http://spaces.ac.cn/archives/4062/ 参考:https://en.wikipedia.org/wiki/Exterior_derivative 比如Ω是一个曲面( ...