SQL FETCH

概要:このチュートリアルでは、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 } ONLYCode language: SQL (Structured Query Language) (sql)

この構文では、

  • ROWROWSFIRSTNEXTは同義語です。したがって、これらは互換的に使用できます。
  • 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テーブルを使用します。

SQL FETCH - employees table

次のステートメントは、最も高い給与を持つ最初の従業員を返します。

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行をスキップしてから、行の返却を開始します。
このチュートリアルは役に立ちましたか?