SQLのORDER BY句を使用すると、SELECT文で取得したレコード(行)を並び替えることができます。
ORDER BYで、特定の列(キー)の値でレコードを並び替えたり、複数の列の指定して並び替えたりもできます。
また、場合によっては計算式の結果をソートキーに設定することもできます。
SQLやプログラムの世界では、「並び替え」を一般的に「ソート」と呼ぶことが多いため、以降は「ソート」という表記を使用させて頂きます。
ORDER BYの構文
まずは、SQLで昇順/降順でレコードをソートする時に使用する、ORDER BY句の構文を見ていきましょう。
ORDER BY ソートキー [ASC | DESC], ソートキー [ASC | DESC], ...
ソートキーには、並び替え時に使用する列名または式を指定します。
昇順でソートする場合は、ソートキーの後ろにASCを指定します。逆に降順でソートする時は、ソートキーの後ろにDESCを指定します。省略した場合は、ASCを指定した時と同じように昇順でソートが行われます。
レコードを昇順・降順で並び替える
実際に、ORDER BYを使用してレコードを昇順・降順で並び替えるサンプルコードを見ていきましょう。
今回は、次のサンプルテーブル用意して試していきましょう。
▪️ テーブル名:scores
Id | Name | Rank | Score |
---|---|---|---|
1 | Yamada Taro | A | 50 |
2 | Suzuki Ichiro | A | 30 |
3 | Sato Taro | B | 40 |
4 | Tanaka Jiro | B | 70 |
5 | Ito Hanako | C | 100 |
昇順でソートする
まずは、昇順でレコードをソートする例を解説します。
サンプル表(scoresテーブル)のデータを、Score列の昇順でソートする場合、SQLは次のようになります。
SELECT *
FROM scores
ORDER BY Score
▪️実行結果
| id | Name | Rank | Score |
| ------ | ------------- | ----- | ----- |
| 2 | Suzuki Ichiro | A | 30 |
| 3 | Sato Taro | B | 40 |
| 1 | Yamada Taro | A | 50 |
| 4 | Tanaka Jiro | B | 70 |
| 5 | Ito Hanako | C | 100 |
SQLを実行すると、Score列の昇順でレコードがソートされていることが分かります。
降順でソートする
続いて降順でレコードをソートする例を解説します。
降順でソートを行う場合は、ORDER BYでソートを行うカラムの後ろにDESCを付けます。
SELECT *
FROM scores
ORDER BY Score DESC
複数のキーでソートする
複数のキー(カラム)を指定して、ORDER BYでソートを行う場合は、カンマ区切りでカラム名を指定します。
複数のキーを指定した場合のソートの優先順は、カンマ区切りで先に書いたカラムから順にソートが行われます。
scoresテーブルを、ランクと次にスコアの降順でソートするSQLを見てみましょう。
SELECT *
FROM scores
ORDER BY Rank, Score DESC
▪️実行結果
| id | Name | Rank | Score |
| ------ | ------------- | ----- | ----- |
| 1 | Yamada Taro | A | 50 |
| 2 | Suzuki Ichiro | A | 30 |
| 4 | Tanaka Jiro | B | 70 |
| 3 | Sato Taro | B | 40 |
| 5 | Ito Hanako | C | 100 |
グループ化(GROUP BY)した結果を並び替える
GROUP BYでデータを集約した結果を、ORDER BYでソートすることもできます。
例えば、売上を集計した後に集計した金額でソートするなど、さまざまな場面で活用できます。
先ほどに引き続き、scoresテーブルを使って、ランク毎のScoreを集計し、集計したScore列の降順でデータをソートしてみましょう。
SELECT Rank
, Score
FROM scores
GROUP BY Rank
ORDER BY Score DESC
▪️実行結果
| Rank | Score |
| ----- | ----- |
| B | 110 |
| B | 100 |
| A | 80 |
NULLデータの扱い
ここからは、ORDER BYでNULLのデータを並び替える時の動作を解説します。
実は、ソート時のNULLの扱いはデータベースによって挙動が異なり、NULLを最小値とするデータベースもあったり、NULLを最大値として扱うデータベースもあります。
NULLを最小値として扱うデータのベースの場合、ORDER BYでソートを行うとNULLが先頭に来るように並び替えが行われます。
SQL> SELECT Id, Score FROM scores ORDER BY Score
| Id | Score |
| ----- | -------- |
| 1 | (NULL) |
| 2 | 40 |
| 3 | 70 |
逆に、NULLを最大値として扱うデータベースの場合、ORDER BYでソートを行うとNULLが最後尾に来るように並び替えされます。
SQL> SELECT Id, Score FROM scores ORDER BY Score
| Id | Score |
| ----- | -------- |
| 2 | 40 |
| 3 | 70 |
| 1 | (NULL) |
このように、NULLの扱いはデータベースによって異なるため、注意が必要です。
主なデータベースのNULLデータの扱いは次の表の通りです。
データベース(RDBMS) | NULLの扱い |
---|---|
SQL SERVER | 最小値 |
Oracle | 最大値 |
PostgreSQL | 最大値 |
MySQL | 最小値 |
NULLの並び順を指定する(NULLS LAST/FIRST)
一部のデータベースにでは、ORDER BYでソートを行う時に、NULLS FIRSTまたはNULLS LASTを指定して、NULLのソート位置を制御できます。
NULLS FIRSTを指定すると、NULLを最小値として扱い先頭に並び替えます。NULLS LASTを指定すると、NULLを最大値として扱い、最後尾にレコードを並び替えます。
まとめ
SQLのORDER BY句を使用して、レコードを昇順・降順で並び替え(ソート)する方法について解説してきました。ORDER BY`によるソートはSQLおける基本知識ですので、是非覚えておきましょう。
余談ですが、昇順・降順で指定するASC | DESCは次の英語を略したものになります。
ASC: ascending
DESC: descending