Oracle Fetch子句

Oracle Fetch子句

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

Oracle FETCH子句简介

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

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

如下查询使用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

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

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

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及如下版本的,请参考如下语句 -fetch

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

执行上面查询语句,获得如下结果 -ui

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

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子句来限制查询返回的行。

相关文章
相关标签/搜索