Oracle Databaseでは、検索結果の取得件数を制限するためにROWNUMという擬似列を利用できます。大量のデータから先頭数件だけ取得したい場合や、ページング処理を実装する場合などでよく使われる機能です。
ただし、ROWNUMは通常の列とは異なる特殊な動きをするため、条件指定の方法を間違えると期待した結果が取得できないことがあります。この記事では、Oracle DatabaseにおけるROWNUMの仕組みや正しい使い方、近年利用される別の方法について解説します。
Oracle DatabaseのROWNUMとは何か
ROWNUMは、Oracle DatabaseがSELECT文の結果に対して一時的に付与する連番のような擬似列です。テーブルに実際に保存されている列ではなく、検索結果が作られる過程で自動的に割り当てられます。
例えば以下のSQLでは、取得したデータに対してROWNUMを表示できます。
SELECT ROWNUM, empno, ename FROM emp;
実行結果では、最初の行にはROWNUM=1、次の行にはROWNUM=2というように番号が付きます。
この仕組みを利用すると、取得する行数を制限できます。
ROWNUMで取得件数を制限する基本的な方法
最も基本的な使い方は、WHERE句でROWNUMを指定する方法です。
例えば、先頭から10件だけ取得したい場合は以下のように記述します。
SELECT * FROM employees WHERE ROWNUM <= 10;
このSQLでは、検索結果のうち最初の10行だけが返されます。
大量のデータを扱う処理では、必要な件数だけ取得することで処理時間やメモリ使用量を減らすことができます。
ROWNUMを使うときに注意すべきポイント
ROWNUMで特に注意が必要なのは、ORDER BYと組み合わせる場合です。
例えば、以下のSQLで給与が高い順に10件取得したいと考えることがあります。
SELECT * FROM employees WHERE ROWNUM <= 10 ORDER BY salary DESC;
しかし、このSQLでは期待通りの結果になりません。
理由は、ROWNUMが付与された後にORDER BYによる並び替えが行われるためです。つまり、最初に取得された10件を給与順に並べ替えているだけになります。
例えば社員データ全体から給与上位10人を取得したい場合は、先に並び替えを行う必要があります。
ORDER BYとROWNUMを組み合わせる正しい書き方
並び替えた結果から件数を制限する場合は、副問い合わせを利用します。
例。
SELECT * FROM (
SELECT * FROM employees ORDER BY salary DESC
) WHERE ROWNUM <= 10;
このように内側のSELECTで並び替えを完了させ、その結果に対してROWNUMを適用します。
処理の流れは以下のようになります。
- employeesテーブルからデータを取得する
- salaryの降順に並び替える
- 並び替え後の結果にROWNUMを付与する
- 先頭10件だけ取得する
この順番を理解すると、ROWNUMによる取得制限の動きを正しく把握できます。
Oracle Database 12c以降ではFETCH FIRSTも利用できる
Oracle Database 12c以降では、ROWNUMを使わなくても取得件数を制限できるFETCH FIRST句が追加されています。
例えば10件取得する場合は以下のように書けます。
SELECT * FROM employees ORDER BY salary DESC FETCH FIRST 10 ROWS ONLY;
この書き方はSQLの意図が分かりやすく、他のデータベース製品で使われるLIMIT句に近い感覚で利用できます。
新規開発ではFETCH FIRSTを利用し、既存システムや古いOracle環境ではROWNUMを利用するという使い分けが一般的です。
ページング処理でROWNUMを使う場合
検索結果を10件ずつ表示するようなページング処理では、ROWNUMを応用して利用できます。
例えば11件目から20件目を取得したい場合、単純にROWNUMを指定するだけでは対応できません。
ROWNUMは1から順番に割り当てられるため、以下のような条件は期待通り動作しません。
WHERE ROWNUM > 10
この場合、ROWNUMが10を超える前に判定が行われるため、結果が返らなくなります。
ページングでは一度ROWNUMを付与した結果をさらに外側から絞り込む方法を使用します。
まとめ|OracleのROWNUMは取得件数制限に便利な擬似列
Oracle DatabaseではROWNUMを利用することで、検索結果の取得件数を制限できます。特に大量データから先頭数件だけ取得する処理では便利な機能です。
ただし、ROWNUMは通常の列とは違い、SQLの評価順序によって結果が変わります。ORDER BYと組み合わせる場合やページング処理では、副問い合わせを使うなど正しい書き方が必要です。
Oracle Database 12c以降ではFETCH FIRST句も利用できるため、環境や用途に応じてROWNUMと使い分けることで、より安全で分かりやすいSQLを記述できます。


コメント