MySQL の ORDER BY
ここでは MySQL の ORDER BY についてご説明します。
サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。
MySQL の ORDER BY で結果セットを並べ替える
MySQL で結果セットのレコードの順番を並べ替えたい時には ORDER BY を使って並べ替えることができます。
SELECT 文で ORDER BY カラム名 のように指定すると、そのカラム名の値で結果セットのレコードが並べ替えられます。
例えば、次のような students テーブルがあります。
この students テーブルのレコードを、first_name のアルフベット順に並べ替えて取得するには次のようにします。
SELECT *
FROM students
ORDER BY first_name;
[実行結果]
students テーブルのレコードが first_name のアルフベット順にソートされて、取得できていますね。
ORDER BY で結果セットを降順に並べ替える
ORDER BY カラム名 と指定すると、デフォルトでは結果セットがカラムの値の昇順でソートされます。
カラムの値の降順で並べ替えたい時には ORDER BY カラム名 DESC のように、カラム名に続けて DESC を指定します。
例えば、students テーブルのレコードを、誕生日の遅い人から順番に並べ替えたい場合は、次のようにできます。
SELECT *
FROM students
ORDER BY birthday DESC;
[実行結果]
students テーブルのレコードが birthday の降順でソートされていますね。
複数カラムでの並べ替えと、ENUM カラムのソート順について
ここまで、ひとつのカラムを指定して、結果セットを並べ替えしてきましたが、複数のカラム名を指定して並べ替えることも可能です。
その場合は ORDER BY カラム名1, カラム名2, カラム名3, ... のようにカラムをカンマで区切って続けます。
このように指定すると、結果セットがまずは カラム名1 の昇順、次にカラム名2 の昇順、、、のようにレコードが並べ替えされます。
降順にしたい場合は、降順にしたいカラム名の直後に DESC をつけます。
例えば、students テーブルのレコードを、性別 (M or F) を降順で並べた後に、first_name で並べ替えたい場合は、次のようにできます。
SELECT *
FROM students
ORDER BY gender DESC,
first_name;
[実行結果]
students テーブルのレコードが、まず gender でソートされ、次に first_name でソートされています。
ここで、注意したいのは、gender がアルファベット順の降順になっていないところです。
これは gender のデータ型が ENUM ('M','F') だからで、ENUM のカラムは定義したインデックス順が昇順となります。
ですので、昇順が M, F / 降順が F, M になるため、F が先にきています。
ENUM のカラムを定義する際に ENUM ('F','M') のようにアルファベット順で指定しておくか、ORDER BY で CHAR にキャストすることで、ENUM カラムの値もアルファベット順にならべることができます。
以上、MySQL の ORDER BY についてご説明しました。