SQL 选择指定的记录数

示例

SQL 2008标准定义了该FETCH FIRST子句以限制返回的记录数。

SELECT Id, ProductName, UnitPrice, Package 
FROM Product 
ORDER BY UnitPrice DESC
FETCH FIRST 10 ROWS ONLY

仅某些RDMS的最新版本支持此标准。其他系统中提供了特定于供应商的非标准语法。Progress OpenEdge 11.x也支持FETCH FIRST <n> ROWS ONLY语法。

此外,OFFSET <m> ROWSbeforeFETCH FIRST <n> ROWS ONLY允许在获取行之前跳过行。

SELECT Id, ProductName, UnitPrice, Package 
FROM Product 
ORDER BY UnitPrice DESC
OFFSET 5 ROWS
FETCH FIRST 10 ROWS ONLY

SQL Server和MS Access支持以下查询:

SELECT TOP 10 Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC

要在MySQL或PostgreSQL中执行相同的操作,LIMIT必须使用关键字:

SELECT Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
LIMIT 10

在Oracle中,可以这样操作ROWNUM:

SELECT Id, ProductName, UnitPrice, Package
FROM Product
WHERE ROWNUM <= 10
ORDER BY UnitPrice DESC

结果10条记录。

Id    ProductName               UnitPrice             Package
38    Côte de Blaye             263.50                12 - 75 cl bottles
29    Thüringer Rostbratwurst   123.79                50 bags x 30 sausgs.
9    Mishi Kobe Niku            97.00                 18 - 500 g pkgs.
20    Sir Rodney's Marmalade    81.00                 30 gift boxes
18    Carnarvon Tigers          62.50                 16 kg pkg.
59    Raclette Courdavault      55.00                 5 kg pkg.
51    Manjimup Dried Apples     53.00                 50 - 300 g pkgs.
62    Tarte au sucre            49.30                 48 pies
43    Ipoh Coffee               46.00                 16 - 500 g tins
28    Rössle Sauerkraut         45.60                 25 - 825 g cans

供应商细微差别:

重要的是要注意,TOPMicrosoft SQL中的in在WHERE子句之后操作,并且如果它们存在于表中的任何位置,则它们将返回指定数量的结果,而  ROWNUM作为WHERE子句的一部分工作,因此如果指定数量的行中不存在其他条件在表的开头,如果可能会发现其他结果,您将得到零结果。