3つのネイティブSQLページング構文
SQLでは、ページングクエリを実行する方法はいくつかあります。以下に、よく使われるSQLページングステートメントを3つ示します。
- LIMIT と OFFSET キーワードを使用する:
SELECT column1, column2, ...
FROM table
LIMIT <num_rows> OFFSET <offset>
このうち、は1ページあたりに返す行数を指定し、は結果セットの何行目からデータを取得するかを指定します。
例えば、1ページ(1ページはデータの行が10ずつ)の検索結果に戻ります。
SELECT column1, column2, ...
FROM table
LIMIT 10 OFFSET 0
2ページ目に戻るには検索結果:
SELECT column1, column2, ...
FROM table
LIMIT 10 OFFSET 10
- ROW_NUMBER() 関数を利用する:
SELECT column1, column2, ...
FROM (
SELECT column1, column2, ..., ROW_NUMBER() OVER (ORDER BY column_name) AS row_num
FROM table
) AS subquery
WHERE row_num BETWEEN <start_row> AND <end_row>
各々、とで1ページの開始行と終了行が指定されます。
たとえば、1ページ目に戻り、1ページに10行のデータを取得するクエリ
SELECT column1, column2, ...
FROM (
SELECT column1, column2, ..., ROW_NUMBER() OVER (ORDER BY column_name) AS row_num
FROM table
) AS subquery
WHERE row_num BETWEEN 1 AND 10
2ページ目の検索結果に戻るには:
SELECT column1, column2, ...
FROM (
SELECT column1, column2, ..., ROW_NUMBER() OVER (ORDER BY column_name) AS row_num
FROM table
) AS subquery
WHERE row_num BETWEEN 11 AND 20
- OFFSET FETCH NEXTキーワードを使用する(SQL ServerおよびOracleデータベースのみで利用可能):
SELECT column1, column2, ...
FROM table
ORDER BY column_name
OFFSET <offset> ROWS FETCH NEXT <num_rows> ROWS ONLY
オフセットは結果セットの何行目からデータの返却を開始するかを指定し、は1ページ当たりに返却する行数を指定します。
例えば、10行ずつデータを表示する検索結果の1ページ目に戻るには、
SELECT column1, column2, ...
FROM table
ORDER BY column_name
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
2ページ目の検索結果に戻るには、
SELECT column1, column2, ...
FROM table
ORDER BY column_name
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
上記の例では、tableとcolumn_nameを実際のテーブル名と列名に置き換える必要があることに注意してください。