概要:このチュートリアルでは、SQLのFETCH
句を使用して、クエリによって返される行数を制限する方法を学びます。
SQL FETCH句の概要
クエリによって返される行数を制限するには、LIMIT
句を使用します。LIMIT
句は、MySQL、H2、HSQLDBなど、多くのデータベースシステムで広くサポートされています。ただし、LIMIT
句はSQL標準には含まれていません。
SQL:2008では、LIMIT
句と同様の機能を持つOFFSET FETCH
句が導入されました。OFFSET FETCH
句を使用すると、結果セット内の最初のN
行をスキップしてから、行の返却を開始できます。
以下に、SQLのFETCH
句の構文を示します。
OFFSET offset_rows { ROW | ROWS }
FETCH { FIRST | NEXT } [ fetch_rows ] { ROW | ROWS } ONLY
Code language: SQL (Structured Query Language) (sql)
この構文では、
ROW
とROWS
、FIRST
とNEXT
は同義語です。したがって、これらは互換的に使用できます。offset_rows
は整数であり、ゼロまたは正の数である必要があります。offset_rows
が結果セット内の行数よりも大きい場合、行は返されません。fetch_rows
も整数であり、返される行数を決定します。fetch_rows
の値は1以上である必要があります。
行はテーブルに特定の順序で格納されているわけではないため、一貫した出力を得るためには、常にFETCH
句をORDER BY
句と組み合わせて使用する必要があります。
Oracle Database 12c+、PostgreSQL 10+、Microsoft SQL Server 2012+など、多くのデータベースシステムがOFFSET FETCH
句をサポートしています。ただし、各データベースシステムは、いくつかの差異はあるものの、OFFSET FETCH
句を異なる方法で実装しています。
OFFSET FETCH
句は、通常、ページネーションが必要なクライアントまたはWebアプリケーションで使用されます。たとえば、各ページに10行ある場合、2番目のページの行を取得するには、最初の10行をスキップし、次の10行を返します。
SQL FETCHの例
デモンストレーションのために、サンプルデータベースのemployees
テーブルを使用します。

次のステートメントは、最も高い給与を持つ最初の従業員を返します。
SELECT
employee_id,
first_name,
last_name,
salary
FROM employees
ORDER BY
salary DESC
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;
Code language: SQL (Structured Query Language) (sql)
この例では、まず、ORDER BY
句は給与の高い順に従業員をソートします。OFFSET
句はゼロ行をスキップし、FETCH
句は最初の行を返します。
次のステートメントは、従業員を給与でソートし、最も給与の高い最初の5人の従業員をスキップし、次の5人をフェッチします。
SELECT
employee_id,
first_name,
last_name,
salary
FROM employees
ORDER BY
salary DESC
OFFSET 5 ROWS
FETCH NEXT 5 ROWS ONLY;
Code language: SQL (Structured Query Language) (sql)
まとめ
- SQLの
FETCH
句を使用して、クエリによって返される行数を制限します。 - SQLの
FETCH
句は、結果セット内のN行をスキップしてから、行の返却を開始します。