SELECT文で取得した結果を並び替える際に利用するのがORDER BY句です。
SELECT (カラム名),~ FROM (テーブル名) ORDER BY (ソートキー)DESC/ASC;
このページではORDER BY句の基本的な使い方から、ソートキーが複数ある場合の動作や昇順や降順の指定方法などより実践的な利用方法までを図解付き・サンプルコード付きで解説します。
プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧下さい。
ORDER BY句の使い方
ORDER BY句は、SELECT文で取得した結果の並び順を変えるために用います。
まずは、以下のテーブルからORDER BY句を利用せずにSELECT文を実行してみます。
SELECT * FROM PointList; /* 結果 +----+------+-------+----------+------+---------+ | ID | Name | Class | Japanese | Math | English | +----+------+-------+----------+------+---------+ | 1 | 佐藤 | A | 100 | 100 | 85 | | 2 | 鈴木 | A | 90 | 70 | 70 | | 3 | 高橋 | A | 85 | 70 | 65 | | 4 | 中村 | A | 90 | 65 | 85 | | 5 | 小林 | B | 70 | 90 | NULL | | 6 | 山口 | B | 90 | 85 | NULL | | 7 | 田中 | B | 70 | 90 | NULL | | 8 | 伊藤 | B | 70 | 90 | NULL | +----+------+-------+----------+------+---------+ */
さて、ここで取得した8件のレコードの並び順はどのように指定されているか分かりますか?
「答えはID列・・・」と言いたいのですが、実はこれは完全なる偶然の結果にすぎません。答えは「毎回ランダムに取得される」です。
実は全く同じSELECT文を実行しても、結果が変わってしまう場合は稀に存在するというのが、SELECT文の落とし穴。
ランダムでもOKな場合は特に並び順を気にする必要はないのですが、システム的に毎回並び順が変わってしまうのが好ましくない場合が存在します。
その際に利用するのがORDER BY句なのです。
ORDER BY:降順(昇順)に並び替え
先ほどと同じテーブルを利用して、Math列の値で昇順となるように結果を並び替えてみます。
SELECT * FROM PointList ORDER BY Math; /* 結果 +----+------+-------+----------+------+---------+ | ID | Name | Class | Japanese | Math | English | +----+------+-------+----------+------+---------+ | 4 | 中村 | A | 90 | 65 | 85 | | 2 | 鈴木 | A | 90 | 70 | 70 | | 3 | 高橋 | A | 85 | 70 | 65 | | 6 | 山口 | B | 90 | 85 | NULL | | 5 | 小林 | B | 70 | 90 | NULL | | 7 | 田中 | B | 70 | 90 | NULL | | 8 | 伊藤 | B | 70 | 90 | NULL | | 1 | 佐藤 | A | 100 | 100 | 85 | +----+------+-------+----------+------+---------+ */
ご覧のように、ORDER BY句で指定したMath列の値が昇順になるようにレコードが並び替えられます。
逆にORDER BY句を用いて降順に並び替えをしたい場合は明示的にDESCキーワードを記述します。
-- Math列の値で降順に並び替え SELECT * FROM PointList ORDER BY Math DESC; /* 結果 +----+------+-------+----------+------+---------+ | ID | Name | Class | Japanese | Math | English | +----+------+-------+----------+------+---------+ | 1 | 佐藤 | A | 100 | 100 | 85 | | 5 | 小林 | B | 70 | 90 | NULL | | 7 | 田中 | B | 70 | 90 | NULL | | 8 | 伊藤 | B | 70 | 90 | NULL | | 6 | 山口 | B | 90 | 85 | NULL | | 2 | 鈴木 | A | 90 | 70 | 70 | | 3 | 高橋 | A | 85 | 70 | 65 | | 4 | 中村 | A | 90 | 65 | 85 | +----+------+-------+----------+------+---------+ */
ORDER BY句:複数のソートキーを用いる
ORDER BY句では、ソートキーを複数設定することも可能です。
ここでは、Japanese列とMath列を用いて実演してみます。
SELECT * FROM PointList ORDER BY Japanese,Math; /* 結果 +----+------+-------+----------+------+---------+ | ID | Name | Class | Japanese | Math | English | +----+------+-------+----------+------+---------+ | 5 | 小林 | B | 70 | 90 | NULL | | 7 | 田中 | B | 70 | 90 | NULL | | 8 | 伊藤 | B | 70 | 90 | NULL | | 3 | 高橋 | A | 85 | 70 | 65 | | 4 | 中村 | A | 90 | 65 | 85 |←ここに注目 | 2 | 鈴木 | A | 90 | 70 | 70 |←ここに注目 | 6 | 山口 | B | 90 | 85 | NULL |←ここに注目 | 1 | 佐藤 | A | 100 | 100 | 85 | +----+------+-------+----------+------+---------+
最初のソートキーであるJapanese列で昇順に並び替えられますが、Japanese列の値が同じ場合は、次のソートキーであるMath列によって昇順で並び替えが行われます。
優先したいソートキーから順に「,」区切りで記述するという点を押さえておきましょう!
ソートキーを複数指定する場合は指定するソートキーごとに、昇順か降順か?を決めることができます。
以下のサンプルコードでは、Japanese列は降順・Math列は昇順で並び替えを行っています。
SELECT * FROM PointList ORDER BY Japanese DESC ,Math ASC; /* 結果(Japanese列は降順・Math列は昇順) +----+------+-------+----------+------+---------+ | ID | Name | Class | Japanese | Math | English | +----+------+-------+----------+------+---------+ | 1 | 佐藤 | A | 100 | 100 | 85 | | 4 | 中村 | A | 90 | 65 | 85 |←ここに注目 | 2 | 鈴木 | A | 90 | 70 | 70 |←ここに注目 | 6 | 山口 | B | 90 | 85 | NULL |←ここに注目 | 3 | 高橋 | A | 85 | 70 | 65 | | 5 | 小林 | B | 70 | 90 | NULL | | 7 | 田中 | B | 70 | 90 | NULL | | 8 | 伊藤 | B | 70 | 90 | NULL | +----+------+-------+----------+------+---------+
ORDER BY句:NULLの順番
NULL値が含まれるカラムをソートキーに設定した場合は、先頭 or 末尾にまとめて表示されます。
ここでは、NULL値が含まれるEnglish列をソートキーに設定してみましょう。
SELECT * FROM PointList ORDER BY English; /* 結果 +----+------+-------+----------+------+---------+ | ID | Name | Class | Japanese | Math | English | +----+------+-------+----------+------+---------+ | 5 | 小林 | B | 70 | 90 | NULL |←ここに注目 | 6 | 山口 | B | 90 | 85 | NULL |←ここに注目 | 7 | 田中 | B | 70 | 90 | NULL |←ここに注目 | 8 | 伊藤 | B | 70 | 90 | NULL |←ここに注目 | 3 | 高橋 | A | 85 | 70 | 65 | | 2 | 鈴木 | A | 90 | 70 | 70 | | 1 | 佐藤 | A | 100 | 100 | 85 | | 4 | 中村 | A | 90 | 65 | 85 | +----+------+-------+----------+------+---------+ */
ご覧のように、検索結果の先頭にNULL値が含まれるレコードがまとめて表示されました。
なお、NULL値が先頭に来るのか末尾に来るのか?はDBMSによっても違うのですが、基本的には決まりがありません。
よって、NULL値を先頭にしたい・・・というような指定ができるかどうかはできない!とまずは考えておくのがOK(=NULL値が含まれるカラムでORDER BYを利用するのが要注意!)。ただし、利用するDBMSによっては先頭なのか末尾なのか?を指定できる場合もあるので、そこは仕様の詳細を確認しておく必要があります。
SELECT句に含まれないカラムをソートキーとして利用
ORDER BY句は比較的制限が緩いです。そのため、以下のようにSELECT句に含まれないカラムをソートキーとして利用するようなことも可能です。
-- Math列の値でID列を降順に並び替え SELECT ID FROM PointList ORDER BY Math DESC; /* 結果 +----+ | ID | +----+ | 1 | | 5 | | 7 | | 8 | | 6 | | 2 | | 3 | | 4 | +----+ */
ORDER BY句の基本的な使い方は以上です。最後にORDER BY句の利用方法のまとめを記載しておきます。
システムエンジニアを目指したい方は
システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。
正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。
システムエンジニア向けに「できるエンジニア」になる方法を1から解説しておりますので、是非ご覧ください。