Oracle『ORDER BY句の使い方』データをソートする

Oracle『ORDER BY句の使い方』データをソートする Oracle SQL入門

【本サイトでは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_NOCHAR(1)1
出席番号STUDENT_NONUMBER(3)2
名前NAMEVARCHAR2(30)
身長(cm)HEIGHTNUMBER(4,1)
成績GRADECHAR(1)
部活CLUBVARCHAR2(30)
備考NOTEVARCHAR2(100)
【表1】STUDENTテーブルの定義
クラス出席番号名前身長(cm)成績部活備考
11ジョニー170.0Cサッカーおとぼけキャラ
12ボビー198.0BサッカーNULL
13カレン157.0AテニスNULL
21デキスギ150.0Aサッカーミスターパーフェクト
22ノビタ145.0ENULL青いタヌキと同居している
23ホネカワ148.0D野球NULL
【表2】STUDENTテーブルのデータ

クラスごとに名前の降順で並べる場合、SQLは以下のようになります。
クラスは昇順で並べるのでASCは省略しています。

SELECT
    * 
FROM
    STUDENT 
ORDER BY
    CLASS_NO
    , NAME DESC;

実行結果は以下です。

Oracle_ORDER_BYの実行結果

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;

実行結果は以下です。

Oracle_NULLS_FIRSTを使ったSQLの実行結果

指定した通り、NOTEがNULLのデータを最初にして結果を取得できました。

NULLを最後尾にする(NULLS LAST)

NULLS LASTは、値が入っていない(NULL)のデータを最後尾にして並べる構文です。

ORDER BY
    [カラム名] NULLS LAST

備考に記載のない生徒を最後尾にして取得する場合のSQLは以下になります。
記載のある、なしの中では名前順に並べたいので、続けてNAME列を指定しています。

SELECT
    * 
FROM
    STUDENT 
ORDER BY
    NOTE NULLS LAST
    , NAME;

実行結果は以下です。

Oracle_NULLS_LASTを使ったSQLの実行結果

値が入っていないデータを後回しにする形で結果を取得できました。

値に従って順序付けする(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;

実行結果は以下です。

Oracle_CASE式での並び替えを使ったSQLの実行結果

期待通りの順番になりました!

それぞれ割り振った「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;

実行結果は以下です。

Oracle_CASE式での並び替えを使ったSQLの実行結果

まったく同じ結果になりましたね!

前述した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;

実行結果は以下です。

Oracle_ROW_NUMBERでのランキング付けを行ったSQLの実行結果

ここからさらに高度なSQL構文を組み合わせることで、ランキング上位の人だけを抜き出したり、
テストの結果などに使えば合否判定もSQLで出すことができます!

使う際の注意点としては、この方法でランキング付けした場合、同じ値のものでも順位に差が出るという点です。

例えば、100点が2人いたとして、ROW_NUMBER関数でランキング付けすると、
Oracleが先に取得した方が1位、後に取得した方が2位として結果が出ます。

もし同率1位としたい場合は、RANK関数と呼ばれるランキング専用の関数があるのでそちらを使いましょう。

ORDER BY句の使い方 まとめ

OracleのORDER BY句の使い方について以下説明しました。

  • ORDER BY句について
  • ORDER BY句の書き方
  • ORDER BY句の使い方
  • 昇順ソートと降順ソート
  • NULLS FIRSTとNULLS LAST
  • CASE式を使ったソート
  • ROW_NUMBER関数でランキング付けする方法

SELECTした結果データは、何かのデータ分析や確認作業、
または、後続のプログラムに引き渡すために使うことが多いので、

SELECT文にORDER BY句は必ずつけて実行するクセを付けておきましょう!

タイトルとURLをコピーしました