Oracle ROWNUMの使い方|件数制限・並び替え・ページング

SQL

はじめに

最近、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は並び替えより先に決まるからです。

つまり、

  1. データ取得
  2. ROWNUM付与
  3. 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より先に評価される
  • サブクエリで解決できる
タイトルとURLをコピーしました