【本サイトではGoogleアドセンス、または、アフィリエイト広告を利用しています。】
ORDER BY句とは?
ORDER BY句とは、データベースから取得した結果の並び順を指定するための構文です。
SELECT文で取得したデータは、特に並び順を指定しない場合、Oracleが内部的に決定した順番で取得されますが、
特に結果データが膨大になると、そのままでは読み取りにくいことが多いです。
例えば、生徒のデータを取得する時に、出席番号順よりも、
名前の辞書順やテストの点数順で並び替えた方が作業がしやすいことも場合によってはあります。
そんな時にORDER BY句を使って結果データを自分で指定した順番に並び替えて取得することで、
データ分析やレポート作成などの作業を効率的に行うことができるようになります。
ORDER BY句の書き方
ORDER BY句の書き方は以下です。
SELECT
[カラム名]
, ・・・
FROM
[テーブル名]
WHERE
[条件式]
ORDER BY
[ソートに使うカラム名1] [ASC/DESC]
, [ソートに使うカラム名2] [ASC/DESC]
, ・・・;
ORDER BY句はSELECT文の最後に付加する形で、
ソート(並び替え)に使うカラム名に続いて、半角スペースで区切った後に並び順の指定をします。
SELECT句のカラム名とORDER BY句のカラム名を同期する必要はないので、
1つのカラムを並び替えにだけ使うこともできます。
特に結果データを絞り込む必要がなければ、WHERE句は省略しても大丈夫です。
その場合、SELECT~FROM~ORDER BYの順番でSQLを書きます。
また、ソートに使うカラムは、カンマ区切りで複数指定できます。
例えば、クラスごとに名前を辞書順で並べたい時は、「クラス」「名前」の順にソートします。
このように、カラムを複数指定することで、並び替えたグループの範囲内でさらに並び替えをすることができます。
昇順でソートする(ASC)
昇順ソートとは、小さい値から大きい値にデータを並び替えることです。
昇順ソートを行う場合カラム名に続いて「ASC」を指定しますが、
Oracleでは、昇順ソートは標準の並び順として設定されている為、構文の中では「ASC」省略することができます。
つまり、昇順にソートする場合は、カラム名だけ指定すれば自動的に昇順でデータが取得されます。
プログラムに組込む際は、昇順であることをわかりやすくするために、あえて「ASC」を記載する人もいます。
降順でソートする(DESC)
降順ソートとは、大きい値から小さい値にデータを並び替えることです。
文字列の場合は辞書の逆順になります。
降順でソートする際には、カラム名に続いて「DESC」の指定が必要です。
昇順と違って省略はできないので注意しましょう。
ORDER BY句の使い方
それでは実際にORDER BYを使ってSQLを実行してみましょう!
例として、表1のテーブルに、表2のデータが入っているとします。
論理名 | 物理名 | データ型 | 主キー |
---|---|---|---|
クラス | CLASS_NO | CHAR(1) | 1 |
出席番号 | STUDENT_NO | NUMBER(3) | 2 |
名前 | NAME | VARCHAR2(30) | |
身長(cm) | HEIGHT | NUMBER(4,1) | |
成績 | GRADE | CHAR(1) | |
部活 | CLUB | VARCHAR2(30) | |
備考 | NOTE | VARCHAR2(100) |
クラス | 出席番号 | 名前 | 身長(cm) | 成績 | 部活 | 備考 |
---|---|---|---|---|---|---|
1 | 1 | ジョニー | 170.0 | C | サッカー | おとぼけキャラ |
1 | 2 | ボビー | 198.0 | B | サッカー | NULL |
1 | 3 | カレン | 157.0 | A | テニス | NULL |
2 | 1 | デキスギ | 150.0 | A | サッカー | ミスターパーフェクト |
2 | 2 | ノビタ | 145.0 | E | NULL | 青いタヌキと同居している |
2 | 3 | ホネカワ | 148.0 | D | 野球 | NULL |
クラスごとに名前の降順で並べる場合、SQLは以下のようになります。
クラスは昇順で並べるのでASCは省略しています。
SELECT
*
FROM
STUDENT
ORDER BY
CLASS_NO
, NAME DESC;
実行結果は以下です。
1組の生徒が降順で並んだ後、2組の生徒が降順で並んでます。
指定した通り、クラス昇順 ⇒ 名前降順になっていますね!
ORDER BY句の応用テクニック
ORDER BY句では、先ほどお話した昇順、降順といった基本的な並べ方だけでなく、
他にも様々な方法ががあるので、応用編としてここでご紹介していきます!
SQLについては、先ほど使った生徒データを例として説明します。
NULLを先頭にする(NULLS FIRST)
NULLS FIRSTは、値が入っていない(NULL)のデータを優先して並べる構文です。
ORDER BY
[カラム名] NULLS FIRST
備考に記載のない生徒を優先して取得する場合のSQLは以下になります。
記載のある、なしの中では名前順に並べたいので、続けてNAME列を指定しています。
SELECT
*
FROM
STUDENT
ORDER BY
NOTE NULLS FIRST
, NAME;
実行結果は以下です。
指定した通り、NOTEがNULLのデータを最初にして結果を取得できました。
NULLを最後尾にする(NULLS LAST)
NULLS LASTは、値が入っていない(NULL)のデータを最後尾にして並べる構文です。
ORDER BY
[カラム名] NULLS LAST
備考に記載のない生徒を最後尾にして取得する場合のSQLは以下になります。
記載のある、なしの中では名前順に並べたいので、続けてNAME列を指定しています。
SELECT
*
FROM
STUDENT
ORDER BY
NOTE NULLS LAST
, NAME;
実行結果は以下です。
値が入っていないデータを後回しにする形で結果を取得できました。
値に従って順序付けする(CASE式①)
CASE式とは、条件によって取得する値を変える為の構文です。
ORDER BY句の中で使うことによって、ジャンル分けや所属先のような、
同一レベルの値で順番を決められないデータに順番を付けて並べ替えることができます。
ORDER BY
CASE [カラム名]
WHEN [値1] THEN [任意の値1]
WHEN [値2] THEN [任意の値2]
WHEN ・・・
ELSE [任意の値N]
END
CASEの後ろにソート対象とするカラム名を指定して、
WHENの後ろにカラムに入る値と、その時に割り振る値をTHENの後ろに指定します。
THENに指定する値は数値だけでなく、文字列も指定できますが、
順番を割り振るのであれば、1、2、3・・・と指定していくのが基本的です。
例えば、生徒が所属している部活に順番を付けて並び替えるSQLは以下になります。
サッカーを1番目、野球を2番目、その他を3番目に来るようにしました。
SELECT
*
FROM
STUDENT
ORDER BY
CASE CLUB
WHEN 'サッカー' THEN 1
WHEN '野球' THEN 2
ELSE 3
END
, CLASS_NO
, STUDENT_NO;
実行結果は以下です。
期待通りの順番になりました!
それぞれ割り振った「1:サッカー」「2:野球」「3:その他」のグループ内については、
クラス番号、出席番号の順で並ぶようにしています。
条件式に従って順序付けする(CASE式②)
CASE式には2種類の書き方があり、以下のように条件式を使うこともできます。
ORDER BY
CASE
WHEN [条件式1] THEN [任意の値1]
WHEN [条件式2] THEN [任意の値2]
WHEN ・・・
ELSE [任意の値N]
END
条件式の書き方については、WHERE句の書き方と同じです。
先ほどのCASE式①の例をCASE式②で書き換えると以下のようになります。
SELECT
*
FROM
STUDENT
ORDER BY
CASE
WHEN CLUB = 'サッカー' THEN 1
WHEN CLUB = '野球' THEN 2
ELSE 3
END
, CLASS_NO
, STUDENT_NO;
実行結果は以下です。
まったく同じ結果になりましたね!
前述したCASE式①の方法では、特定のカラムを指定して、入ってくる値の種類でパターン分けしていましたが、
CASE式②のように条件式を使うことで、複数の条件や複数のカラムを考慮した順番分けもできるようになります。
グループごとにランキング付けする(ROW_NUMBER関数)
ROW_NUMBER関数とは、SELECTした結果データの順番を取得する関数です。
このROW_NUMBER関数とORDER BYを組み合わせることで、結果データの値をランキング付けすることができます。
SELECT
ROW_NUMBER() OVER (PARTITION BY [カラム名1], ・・・
ORDER BY [ソートに使うカラム名1] [ASC/DESC], ・・・) AS HEIGHT_RANK
FROM
[テーブル名]
ランキングを取得するので、ORDER BY句ではなく、SELECT句の中に組み込んで使います。
また、ランキングはグループ単位で付けることができるので、
PARTITION BYの後ろにグループ分けに使うカラムを指定します。
そして、ORDER BYの後ろにランキング付けしたい値を持つカラムを指定します。
例えば、クラス単位に背の高いものからランキング付けするSQLは以下です。
SELECT
CLASS_NO
, NAME
, HEIGHT
, ROW_NUMBER() OVER (PARTITION BY CLASS_NO ORDER BY HEIGHT DESC) AS HEIGHT_RANK
FROM
STUDENT;
実行結果は以下です。
ここからさらに高度なSQL構文を組み合わせることで、ランキング上位の人だけを抜き出したり、
テストの結果などに使えば合否判定もSQLで出すことができます!
使う際の注意点としては、この方法でランキング付けした場合、同じ値のものでも順位に差が出るという点です。
例えば、100点が2人いたとして、ROW_NUMBER関数でランキング付けすると、
Oracleが先に取得した方が1位、後に取得した方が2位として結果が出ます。
もし同率1位としたい場合は、RANK関数と呼ばれるランキング専用の関数があるのでそちらを使いましょう。
ORDER BY句の使い方 まとめ
OracleのORDER BY句の使い方について以下説明しました。
SELECTした結果データは、何かのデータ分析や確認作業、
または、後続のプログラムに引き渡すために使うことが多いので、
SELECT文にORDER BY句は必ずつけて実行するクセを付けておきましょう!