ここでは検索結果の並び替えを行う order by 句について学習していきましょう。select 文に order by 句を指定することで検索結果の並び順を制御できます。

order by 列名, ...

order by 句は , カンマで区切って複数の列名を指定できます。この場合、先頭に指定した列から順に並び替えが行われます。

またorder by 句はデフォルトで指定した列の値を昇順に出力します。ここでいう昇順とは、列の値の小さいものから順に並べることを意味します。反対に大きいものから順に並べることを降順と呼びます。order by 句で降順を指定する場合は desc キーワードを付与します。

order by 列名 desc, ...

昇順であることを明示するために asc キーワードを利用することもできます。

order by 列名 asc, ...

asc キーワードは省略されることが多いです。

並び替え - 昇順

次のSQLは courses テーブルから検索した結果を learning_time 列の値の昇順で出力します。

MariaDB [eldb]> select * from courses order by learning_time;
+----+-----------------+---------------+-------------+
| id | title           | learning_time | category_id |
+----+-----------------+---------------+-------------+
|  1 | PHP Basic       |            30 |           1 |
|  3 | Python Basic    |            40 |           1 |
|  2 | PHP Database    |            50 |           1 |
|  4 | Web Design      |            50 |           2 |
|  5 | Japan's History |           100 |        NULL |
+----+-----------------+---------------+-------------+
5 rows in set (0.00 sec)

MariaDB [eldb]> 

learning_time 列の値の小さいものから順に出力されていることがわかります。

並び替え - 降順

次のSQLは courses テーブルから検索した結果を learning_time 列の値の降順で出力します。

MariaDB [eldb]> select * from courses order by learning_time desc;
+----+-----------------+---------------+-------------+
| id | title           | learning_time | category_id |
+----+-----------------+---------------+-------------+
|  5 | Japan's History |           100 |        NULL |
|  2 | PHP Database    |            50 |           1 |
|  4 | Web Design      |            50 |           2 |
|  3 | Python Basic    |            40 |           1 |
|  1 | PHP Basic       |            30 |           1 |
+----+-----------------+---------------+-------------+
5 rows in set (0.00 sec)

MariaDB [eldb]> 

learning_time 列の値の大きいものから順に出力されていることがわかります。

並び替え - 複数列の指定

order by句には,カンマで区切って複数の列を指定できます。次のSQLは courses テーブルから検索した結果を learning_time の降順で並べ替え、値の等しいものは category_id の降順で並び替えを行います。

MariaDB [eldb]> select * from courses 
    ->          order by learning_time desc, id desc;
+----+-----------------+---------------+-------------+
| id | title           | learning_time | category_id |
+----+-----------------+---------------+-------------+
|  5 | Japan's History |           100 |        NULL |
|  4 | Web Design      |            50 |           2 |
|  2 | PHP Database    |            50 |           1 |
|  3 | Python Basic    |            40 |           1 |
|  1 | PHP Basic       |            30 |           1 |
+----+-----------------+---------------+-------------+
5 rows in set (0.00 sec)

MariaDB [eldb]> 

learning_time 列の値が 50 のレコードが2件存在しますが、この2件のレコードは category_id の降順で並び替えが行われていることがわかります。