Oracle Fetch子句
在本教程中将学习如何使用Oracle FETCH
子句来限制查询返回的行数。
Oracle FETCH子句简介
一些RDBMS(如MySQL和PostgreSQL)使用LIMIT子句来检索查询生成的一部分行记录。
请参阅示例数据库中的产品(products
)和库存(inventories
)表。两个表的结构和关系如下所示 -
以下查询使用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数据库标准中没有LIMIT
子句。 然而,自12c
发布以来,它提供了一个类似但更灵活的子句,即行限制子句。
通过使用行限制子句,重写上面的LIMIT
子句的查询,如下所示:
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及以下版本的,请参考以下语句 -
SELECT
product_name, quantity
FROM
inventories
INNER JOIN products
USING(product_id)
WHERE rownum<=5
ORDER BY quantity DESC;
执行上面查询语句,得到以下结果 -
在这个语句中,行限制子句是:
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
子句来限制查询返回的行。