在本教程中,将学习如何使用Oracle FETCH
子句来限制查询返回的行数。html
Oracle FETCH子句简介
一些RDBMS(如MySQL和PostgreSQL)使用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;
在此示例中,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;
注意:上面查询仅能在Orace 12c以上版本中运行。学习
若是使用的是Oracle 11g及如下版本的,请参考如下语句 -fetch
SELECT product_name, quantity FROM inventories INNER JOIN products USING(product_id) WHERE rownum<=5 ORDER BY quantity DESC;
执行上面查询语句,获得如下结果 -ui
在这个语句中,行限制子句是:
FETCH NEXT 5 ROWS ONLY
与上面使用LIMIT
子句的语句相似,行限制子句返回库存量最高的前5
个产品。
Oracle FETCH子句语法
如下说明了行限制子句的语法:
[ OFFSET offset ROWS] FETCH NEXT [ row_count | percent PERCENT ] ROWS [ ONLY | WITH TIES ]
OFFSET子句
OFFSET
子句指定在行限制开始以前要跳过行数。OFFSET
子句是可选的。 若是跳过它,则偏移量为0
,行限制从第一行开始计算。
偏移量必须是一个数字或一个表达式,其值为一个数字。偏移量遵照如下规则:
- 若是偏移量是负值,则将其视为
0
。 - 若是偏移量为
NULL
或大于查询返回的行数,则不返回任何行。 - 若是偏移量包含一个分数,则分数部分被截断。
FETCH子句
FETCH
子句指定要返回的行数或百分比。
为了语义清晰的目的,您能够使用关键字ROW
而不是ROWS
,FIRST
而不是NEXT
。 例如,如下子句的行为和产生的结果相同:
FETCH NEXT 1 ROWS FETCH FIRST 1 ROW
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;
执行上面查询语句,获得如下结果 -
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;
执行上面示例查询语句,获得如下结果 -
即便查询请求了10
行数据,由于它具备WITH TIES
选项,查询还返回了另外两行。 请注意,这两个附加行在quantity
列的值与第10
行quantity
列的值相同。
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;
执行上面示例查询语句,获得如下结果 -
库存(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;
注意:这个功能能够用于分页的实现。
执行上面查询语句,获得如下结果 -
在本教程中,您已学习如何使用Oracle FETCH
子句来限制查询返回的行。