SELECT文で抽出されるレコードの順は不定です。処理系によって挿入された順だったり、更新の古い順だったり、見かけ上まったくランダムだったりと様々です。
もし抽出されるレコードを特定のカラムの値に注目して整列させたい場合は、ORDER BY句を使います。
ORDER BY句の構文
ORDER BY カラム名 [ASCまたはDESC] [, カラム名 [ASCまたはDESC] …]
レコードをカラム名の値に従って並べ替えます。
カラム名の後にASCと記述すると昇順、DESCと記述すると降順となります。省略した場合は昇順です。
複数のカラムをカンマ区切りで書いた場合、まず第1のカラムの値で並べ替え、第1のカラムの値が同じものの中で第2のカラムの値で並べ替え…となります。
ここまでに学んだすべての句をまとめてみましょう。
句の記述の順番は以下の通りです。
SELECT カラム名・関数・計算式 FROM テーブル
WHERE 条件式1
GROUP BY カラム名
HAVING 条件式2
ORDER BY カラム名;
各句の実行のタイミングは以下の通りです。
1.テーブルから、WHERE句の条件式1を満たすレコードが抽出される。
2.1で抽出されたレコードがGROUP BY句のカラム名でグループ化される
3.2でグループ化されたグループごとに関数・計算式の値が求められる
4.3の結果からHAVING句の条件式2を満たすものが抽出される
5.4の結果をORDER BY句に従って並べ替える
つまり、ORDER BY句が実行されるのは一番最後です。
ORDER BY句の例
例1
SELECT * FROM meibo ORDER BY height;実行結果

カラムheightの値の昇順にレコードが出力されました。
例2
計算の結果に基づいて並べ替えることも出来ます。
SELECT name, ROUND(weight/POW((height/100),2), 1) AS BMI FROM meibo
ORDER BY BMI DESC;実行結果

BMI計算のサンプルにORDER BY句を追加し、BMIの値の降順に並べ替えるようにしました。
例3
グループ化・グループ関数の計算結果について並べ替えることも出来ます。
SELECT subject, ROUND(AVG(score),1) AS average
FROM examination GROUP BY subject ORDER BY average DESC;実行結果

試験の各科目の平均値が高い順に並べ替えています。


コメント