ROWNUM疑似列は、クエリ結果の各行に番号を付けます。その値は、その行がクエリ結果セット内での具体的な位置です。例えば、最初の行の戻り値は1、2番目の行は2、以降も同様に続きます。本記事では主にROWNUM疑似列の使用方法について説明します。
ROWNUM を使用すると、返される行数を制限できます。以下の例のように、employees テーブルから5件のデータを返します:
SELECT * FROM employees WHERE rownum <=5;
ROWNUM を使用する際には、以下の点に注意してください:
ROWNUMの後にORDER BY句がある場合、WHERE条件を満たす結果が再ソートされます。ORDER BY句をサブクエリに埋め込み、ROWNUM疑似列を条件としてトップレベルのクエリに配置することで、ROWNUM条件が行のソート後に実行されるよう強制的に設定できます。以下の例のように、年齢が最も高い上位5名の従業員情報を照会する場合、以下の例のSQLステートメントを使用すると、クエリ結果の上位5件の従業員情報を年齢順に並べ替えるだけになります:SELECT * FROM employees WHERE rownum <=5 ORDER BY age DESC;正しいクエリステートメントは次のとおりです:
SELECT * FROM (SELECT * FROM employees ORDER BY age DESC) WHERE rownum <= 5;WHERE句でROWNUMを任意の正の整数より大きいと指定した場合、常にFALSEが返されます。以下の例のSQLステートメントは、何も返しません:SELECT * FROM employees WHERE rownum > 1;テーブルの最初の行の結果を取得する際、その行の
ROWNUM疑似列の値は1に設定されます。この時点でWHERE条件を評価すると結果はFALSEとなり、その行は除外されます。2番目の行の結果を取得する際、その行のROWNUM疑似列の値は依然として1に設定され、WHERE条件の評価結果はやはりFALSEとなり、この行も除外されます。以降も同様に、すべての行が条件を満たさないため、データは返されません。
UPDATE ステートメントを使用して、テーブルの特定の列に ROWNUM 値を代入することができます。例えば:
UPDATE employees SET id = rownum;
このステートメントは、employees テーブルの id 列に ROWNUM 値を代入します。つまり、id 列に1、2...と、そのテーブルの総行数まで順に値を代入します。
注意
クエリで ROWNUM を使用すると、ビューの最適化に影響を与える可能性があります。