はじめに
最近、Oracleを触り始めて、10件だけ抽出したいと思ったときにLIMIT句を使おうとしたら、エラーになったので備忘録。
OracleではROWNUMを使って、件数制限ができるので、基本的な使い方をまとめてみました。
OracleのROWNUMとは?
ROWNUMとは「取得した順番に付く番号」
ROWNUMは「データに順番をつける番号」です。
理由は、Oracleがデータを取り出すときに、1件目、2件目…と順番に番号を振る仕組みだからです。
例えば、クラスの出席番号のようなイメージです。最初に来た人が1番、次が2番というように決まります。
つまり、ROWNUMは「データが取得された順番」で決まるため、見た目の並び順とは違うことがあります。
ROWNUMのイメージ
たとえば、お菓子を並べるとします。
- 先に取ったお菓子 → ROWNUM = 1
- 次に取ったお菓子 → ROWNUM = 2
という感じです。
ここで大事なのは「どの順番で取ったか」で番号が決まることです。
ROWNUMとROW_NUMBERの違い
ROWNUMはシンプル、ROW_NUMBERは高機能です。
- ROWNUM → 取得順で番号が付く
- ROW_NUMBER → 並び替え後に番号を付けられる
つまり、細かい制御をしたい場合はROW_NUMBERの方が便利です。
ROWNUMの基本的な使い方
先頭N件だけ取得する方法
ROWNUMを使えば簡単に件数制限ができます。
例えば社員データが100件あった場合、最初の10件だけを取得したい時は以下のようにします。
SELECT * FROM employees WHERE ROWNUM <= 10;
これで「最初の10件」だけ取得することができます。
よくある使いどころ(ランキング・一覧表示)
ROWNUMは以下のような場面でよく使われます。
- 上位10件だけ表示
- テスト用に少しだけデータ取得
- 一覧画面の初期表示
つまり「ちょっとだけ取りたいとき」に便利です。
ROWNUMの注意点
ORDER BYと一緒に使うと意図通りにならない理由
ROWNUMは並び替えより先に決まるからです。
つまり、
- データ取得
- ROWNUM付与
- ORDER BY
の順番になります。
そのため、並び替え後の上位ではなく、「元の順番の上位」になってしまいます。
なぜROWNUMは並び替え前に付与されるのか
Oracleの内部処理の都合で、ROWNUMは早い段階で付けられます。
これを知らないと、「なんで?」となる原因になります。
よくある間違い例(NGパターン)
SELECT * FROM employees
WHERE ROWNUM <= 10
ORDER BY salary DESC;
これだと「給料が高い順の10件」にはなりません。
ORDER BYとROWNUMを正しく使う方法
サブクエリを使う
並び替えをROWNUMより先にするためです。
SELECT * FROM (
SELECT * FROM テーブル名 ORDER BY 条件
)
WHERE ROWNUM <= 件数;
ROWNUMがうまく動かない原因と解決方法
「ROWNUM > 1」で0件になる理由
1件目が取れないからです。
ROWNUMは1から順に評価されるため、最初から「>1」は成立しません。
デバッグのポイント
- サブクエリを使っているか
- ORDER BYの位置が正しいか
ここをチェックしましょう。
実務で使える!ROWNUM活用パターン集
上位N件を取得する(ランキング)
最もよく使うパターンです。
重いクエリの負荷を減らす
データを少しだけ取得することで、処理が速くなります。
テストデータの一部抽出
開発時にもよく使われます。
最後に
ROWNUMは一見シンプルですが、「並び替えとの関係」でつまずく人がとても多い機能です。
重要なポイントを抑えて使いこなしましょう。
- ROWNUMは取得順で決まる
- ORDER BYより先に評価される
- サブクエリで解決できる

