【SQL】ORDER BY句:desc/ascをわかりやすく1分で解説

Database

SELECT文で取得した結果を並び替える際に利用するのがORDER BY句です。

SELECT (カラム名),~ FROM (テーブル名)
ORDER BY (ソートキー)DESC/ASC;

このページではORDER BY句の基本的な使い方から、ソートキーが複数ある場合の動作や昇順や降順の指定方法などより実践的な利用方法までを図解付き・サンプルコード付きで解説します。

このページで学べる内容
  • ORDER BY句の基本構文
    • 複数のソートキーを用いる場合
    • 降順の指定方法:DESC
    • 昇順の指定方法:ASC(デフォルト)
  • ORDER BY句を利用する際の注意点・Tips

プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧下さい。

スポンサーリンク

ORDER BY句の使い方

ORDER BY句は、SELECT文で取得した結果の並び順を変えるために用います。

まずは、以下のテーブルからORDER BY句を利用せずにSELECT文を実行してみます。

SQL ORDER BY
pointListテーブル
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:降順(昇順)に並び替え

ORDER BY句の構文ルール
SELECT (カラム名),~ FROM (テーブル名)
ORDER BY (ソートキー)DESC/ASC;
ORDER BY句のルール
  • ポイント①:ORDER BY句は必ずSELECT文の最後に記述する
  • ポイント②:ソートキーの後にDESCキーワードを用いると降順に並ぶ
    • ASCキーワードで昇順 ※何も記述しなくても昇順

先ほどと同じテーブルを利用して、Math列の値で昇順となるように結果を並び替えてみます。

SQL ORDER BY
pointListテーブル
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句に指定したカラムを「ソートキー(Sort Key)」と呼びます。

ORDER BY句:複数のソートキーを用いる

ORDER BY句では、ソートキーを複数設定することも可能です。

ここでは、Japanese列とMath列を用いて実演してみます。

SQL ORDER BY
pointListテーブル
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列をソートキーに設定してみましょう。

SQL ORDER BY
pointListテーブル
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句の利用方法のまとめを記載しておきます。

ORDER BY句のまとめ
  • ポイント①:ORDER BY句は必ずSELECT文の最後に記述する
  • ポイント②:ソートキーの後にDESCキーワードを用いると降順に並ぶ
    • ASCキーワードで昇順 ※何も記述しなくても昇順
  • ポイント③:ソートキーは複数設定することが可能
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 |
+----+------+-------+----------+------+---------+

システムエンジニアを目指したい方は

システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。

正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。

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