問合せ結果を指定した列の値で並べ替えるSQLの句。
ORDER BY句とは、問合せ結果(=SELECT文で取り出した行の集まり)を、指定した列の値で並べ替えるSQLの句です。SELECTだけでは行の順番は保証されないため、見やすい順に整えたいときに使います。
身近な例で考えると、名簿を「五十音順」や「点数の高い順」に並べ直す作業に似ています。中身(名前や点数)は変えず、行の並び順だけを入れ替えるイメージです。
上のツールで▶ボタンを押すと、キー列(並べ替えの基準にする列)を選んでから、値を比べて行を入れ替え、最後に並びが完成するまでの流れを確認できます。
並べ替えの「向き」は、キー列のうしろに付けるキーワードで決めます。
・ASC(ascending=昇順):小さい順(1, 2, 3… / a, b, c…)。省略時はこちらが既定です
・DESC(descending=降順):大きい順(…3, 2, 1 / …c, b, a)
ORDER BY score ASC -- 低い順
ORDER BY score DESC -- 高い順
文字列の場合は文字コード順(おおむねアルファベット順)に、数値の場合は大小で並びます。「ASCもDESCも書かなければ昇順」という点は覚えておくと安心です。上のツールで「点数の高い順(DESC)」と「点数の低い順(ASC)」を切り替えると、並びがちょうど逆になることが分かります。
ORDER BY のうしろにカンマ(,)で区切って複数の列を書くと、優先順位をつけた並べ替えができます。先に書いた列ほど優先されます。
並べ替えの順序は次のようになります。
・第1キー(最初の列):まずこの値で全体を並べる
・第2キー(次の列):第1キーが同じ値だった行の中だけで順番を決める
・第3キー以降も同様に、上位キーで決着がつかないときだけ使われる
身近な例で考えると、クラス別の名簿を「クラス順、同じクラスの中は出席番号順」に並べるのと同じです。それぞれの列に ASC / DESC を別々に指定できます。上のツールの「学年→点数の2キー」シナリオで、第1キーで分けてから第2キーで整える二段階の動きを確認できます。
ORDER BY は SELECT 文の中で一番最後に処理されます。なぜかというと、並べ替えは「表示する行が全部決まった状態」でないと正しく順番をつけられないからです。WHERE で行を絞り、SELECT で列を選び終えた後、最後に整列して返します。
だから SQL を書く順番も末尾に置くルールになっています。
・SELECT 列 FROM 表 WHERE 条件 ORDER BY キー列 の順が基本形です
・SELECT で付けた列の別名(AS)を ORDER BY のキー列として使えるのも、SELECT が先に処理されているためです
身近な例で考えると、全員が出席してから名前を五十音順に並べる点呼と同じです。全員が揃う前に並べ始めると、あとから来た人の位置が決まりません。データも同じで、行が確定してから並べるのが自然な流れです。
NULL(ヌル)とは、「値が存在しない・未入力」を表す特別な状態です(0や空文字とは別物)。ORDER BY でキー列に NULL がある行を並べると、どこに置くかはデータベース製品によって異なりますが、多くのデータベースでは次のように扱います。
・ASC(昇順)のとき:NULL は一番前(最小扱い)に来ることが多い
・DESC(降順)のとき:NULL は一番後ろに来ることが多い
なぜかというと、NULL は「値がない」ため、数値や文字列と大小比較ができません。どんな値よりも「最小」か「最大」かはルールが定まっておらず、製品ごとに判断が異なります。
身近な例で考えると、点数が「未記入」の答案のようなものです。0点とも区別され、「何点なのか分からない」という状態です。実際の業務ではNULLを含む列で並べ替えるときに注意が必要ですが、基本は「NULLは比較できない特別な値」と押さえておきましょう。