2017年6月13日
PostgreSQLやMySQLで使えるLimit句をOracle SQLで使う方法
みなさんこんにちは自称エリート(見習い)です。
先日研修中にPostgreSQLを使用している際、
SELECT文で取得した行数の制限をLIMIT句で行うことができることを知りました。
現在Oracle Master Bronzeの取得を目指している私ですが、
「そういえばOracleで取得件数の制限ってLIMIT句なんてあったかな」と思い調べてみました。
結論から言うとOracle SQLでは使えません。
という訳でOracleでLIMIT句に代わる構文を探してみました。
PostgreSQL / MySQLでのLIMIT句の使用方法
まずはPostgreやMySQLで使えるLIMIT句の構文のおさらいを。
以下のTest_Empテーブルを参考にします。
Test_Emp
Emp_No | Emp_Name |
1 | 相澤 |
2 | 秋元 |
3 | 石井 |
4 | 岩本 |
5 | 牛田 |
6 | 江原 |
7 | 大田 |
8 | 沖本 |
9 | 金森 |
10 | 木田 |
【SQL例】
SELECT * FROM Test_Emp LIMIT 5;
Test_Emp
Emp_No | Emp_Name |
1 | 相澤 |
2 | 秋元 |
3 | 石井 |
4 | 岩本 |
5 | 牛田 |
LIMIT句は必ずSQL文の最後に入れるというのが特徴ですね。
ORDER BY句よりも後です。
Oracle SQLでの行数の上限設定(ROWNUM関数)
それではOracleの場合のSQL文です。
まず上記同様下記のテーブルを用意します。
Test_Emp
|
【SQL例】
SELECT * FROM Test_Emp WHERE ROWNUM <= 5;
Test_Emp
|
Oracleの場合はROWNUM擬似列を使用します。
ただしこのROWNUMはORDER BY句で正しくソートすることができません。
ROWNUMで取得した結果に対してソートを行うので、
LIMIT句の様にソートしてからの取得ができないからです。
ROWNUM擬似列で行数制限しながらソートしたい場合
なので、結果に対してソートを行いたい場合、
副問合せをしてその中でORDER BY句を使用します。
【SQL例】
SELECT * ROWNUM FROM (SELECT * FROM Test_Emp ORDER BY Emp_No DESC) WHERE ROWNUM <= 5
Test_Emp
|
因みにROWNUMの条件式として「>=5」や「>5」はエラーにはなりませんが意味がないので注意してください。
LIMIT句って便利ですね。