3つのネイティブSQLページング構文

SQLでは、ページングクエリを実行する方法はいくつかあります。以下に、よく使われるSQLページングステートメントを3つ示します。

  1. 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
  1. 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
  1. 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を実際のテーブル名と列名に置き換える必要があることに注意してください。

bannerAds