row_limiting_clause(行制限句)とは
Oracle Database 12c から導入された、SELECT 文の結果として返される行数・割合を制限する構文です。これにより、従来は ROWNUM を使った回りくどい書き方が必要だった Top-N クエリや、「上位10件目から20件目を取得する」ページング処理を、直感的な構文で書けるようになりました。
row_limiting_clauseは SELECT 文の ORDER BY 句の後に記述します。位置を誤ると構文エラーになるため要注意です。
基本構文
SELECT <列名1> [, <列名2>, ...]
FROM <表名>
[WHERE <条件>]
[ORDER BY <ソート列>]
[OFFSET n ROWS]
FETCH { FIRST | NEXT }
{ 返される行数 | 返される行の割合 PERCENT }
{ ROW | ROWS }
{ ONLY | WITH TIES };
各キーワードの意味
| キーワード | 意味 |
|---|---|
FIRST |
結果セットの先頭から返す(OFFSET なし時に慣習的に使う) |
NEXT |
OFFSET でスキップした次の行から返す(OFFSET あり時に慣習的に使う) |
n |
返す行数(整数) |
n PERCENT |
全体の n% を返す(端数は切り上げ) |
ROW / ROWS
|
単数・複数の語形の違いのみ。意味はまったく同じ |
ONLY |
指定した行数・割合だけを厳密に返す(基本形) |
WITH TIES |
境界の行と同じソート値を持つ行があればまとめて返す(ORDER BY 必須) |
🔑 試験ポイント:
FIRSTとNEXT、ROWとROWSはそれぞれ同義語です。どちらを使っても動作は同じですが、読みやすさのために使い分けが慣習化しています。
OFFSET 句(行スキップ)
FETCH と組み合わせて使う補助句です。先頭から n 行をスキップしてから行数制限を適用します。
OFFSET n ROWS
FETCH NEXT m ROWS ONLY;
OFFSET を省略した場合は OFFSET 0 ROWS(スキップなし)と同じ動作になります。
パターン別の使い方
① 先頭から上位N件を取得(最基本)
給与の高い順に上位5件を取得する例です。
SELECT last_name, salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS ONLY;
結果イメージ(salary の降順上位5件のみ)
| LAST_NAME | SALARY |
|---|---|
| King | 24000 |
| Kochhar | 17000 |
| De Haan | 17000 |
| Greenberg | 12008 |
| Higgins | 12008 |
🔑 試験ポイント:
ORDER BYと組み合わせることで「上位N件」を取得できます。ORDER BYを書かない場合、どの行が返るかは不定です。
② OFFSET と組み合わせてN+1〜M件目を取得(ページング)
先頭5件をスキップし、次の5件(6〜10件目)を取得する例です。
SELECT last_name, salary
FROM employees
ORDER BY salary DESC
OFFSET 5 ROWS
FETCH NEXT 5 ROWS ONLY;
OFFSET と FETCH の関係
| 目的 | OFFSET | FETCH |
|---|---|---|
| 1〜5件目 |
OFFSET 0 ROWS(省略可) |
FETCH FIRST 5 ROWS ONLY |
| 6〜10件目 | OFFSET 5 ROWS |
FETCH NEXT 5 ROWS ONLY |
| 11〜15件目 | OFFSET 10 ROWS |
FETCH NEXT 5 ROWS ONLY |
🔑 試験ポイント:
OFFSET+FETCH NEXTの組み合わせが「ページング処理」の基本パターンです。OFFSET の行数は「スキップする行数」、FETCH の行数は「取得する行数」と区別して理解しましょう。
③ 割合(PERCENT)で取得
全体のうち上位10%の行を返す例です。
SELECT last_name, salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 10 PERCENT ROWS ONLY;
- 対象の行数が 107 件なら、10% = 10.7 → 切り上げで 11 件が返される。
-
PERCENTはONLYともWITH TIESとも組み合わせ可能です。
🔑 試験ポイント:PERCENT 指定では端数を切り上げして行数を決定します。
④ WITH TIES で同順位をまとめて返す
上位5件を取得するが、5件目と同じ給与の社員がいればまとめて返す例です。
SELECT last_name, salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS WITH TIES;
ONLY と WITH TIES の違い
| 5件目の salary = 12008 の社員が2人いる場合 | |
|---|---|
ONLY |
5件のみ返す(2人のうちどちらかが除外される) |
WITH TIES |
5件 + 12008 の社員を全員返す(6件以上になりうる) |
-
WITH TIESを使う場合、ORDER BYの指定が必須です。 -
ORDER BYなしでWITH TIESを指定するとエラーになります。
🔑 試験ポイント:
WITH TIESは「境界のソートキーが同値の行を取りこぼさない」ための指定です。結果行数が FETCH の指定より多くなることがある点がONLYとの決定的な違いです。
構文上の注意点まとめ
| 制約・ルール | 内容 |
|---|---|
| 記述位置 | SELECT 文の ORDER BY の後が必須 |
| ORDER BY の要否 | 意味のある結果を得るには ORDER BY が必要。WITH TIES では必須
|
| PERCENT の端数 | 切り上げで行数を決定 |
| OFFSET の省略 | 省略 = OFFSET 0 ROWS(先頭から取得) |
| WITH TIES + PERCENT | 組み合わせ可能 |
| ROW と ROWS | 同義語(使い分けは任意) |
| FIRST と NEXT | 同義語(OFFSET なし → FIRST、あり → NEXT が慣習) |
ROWNUM との比較(試験頻出)
Oracle 12c より前は ROWNUM を使った次のような書き方が必要でした。
-- 旧来の Top-5 クエリ(ROWNUM を使う場合)
SELECT last_name, salary
FROM (
SELECT last_name, salary
FROM employees
ORDER BY salary DESC
)
WHERE ROWNUM <= 5;
row_limiting_clause を使えば以下で済みます。
-- Oracle 12c 以降の推奨書き方
SELECT last_name, salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS ONLY;
| 比較項目 | ROWNUM(旧) | FETCH FIRST(12c〜) |
|---|---|---|
| 可読性 | サブクエリが必要で冗長 | 直感的な構文 |
| ページング | 二重サブクエリが必要 | OFFSET だけで実現 |
| PERCENT 指定 | 不可 | PERCENT キーワードで可能 |
| 同順位の扱い | 自力で制御 | WITH TIES で自動処理 |
本章のまとめ
| テーマ | 試験で押さえるポイント |
|---|---|
| 導入バージョン | Oracle Database 12c から追加 |
| FIRST と NEXT | 同義語。OFFSET なし → FIRST、あり → NEXT が慣習 |
| ROW と ROWS | 同義語。意味の違いはない |
| ONLY | 指定行数を厳密に返す(基本形) |
| WITH TIES | 境界ソートキーが同値の行もまとめて返す。ORDER BY 必須 |
| PERCENT | 全体の割合で取得。端数は切り上げ |
| OFFSET | 先頭から n 行スキップ。省略時は 0 扱い |
| 書き方の位置 | ORDER BY の後に記述 |