【SQL】ORDER BY句を使ってレコードを並び替える方法(降順・昇順でソート)

SQLで行(レコード)を並べ替えたい時は、ORDER BY句を使います。

ORDER BY句を使うことで、IDが小さい順(大きい順)に行を並べ替えるといった処理を実現できます。

本記事では、ORDER BY句の使い方について詳しく解説していきます。

ORDER BY句の使い方

ORDER BY句の基本構文は下記です。

SQL
SELECT カラム名
FROM テーブル名
ORDER BY カラム名 [ASC | DESC], カラム名 [ASC | DESC], ...

並べ替えを指定しているのは下記の部分です。

ORDER BY カラム名 [ASC | DESC]

ORDER BYの後に並べ替えの条件となるカラム名を指定し、その後にASCもしくはDESCを指定します。

ASCDESCはそれぞれ並べ替えの条件を意味しています。

クエリ条件
ASC昇順(小さいものから大きいもの)に並び替える
DESC降順(大きいものから小さいもの)に並び替える

何も指定しないとデフォルトで昇順が指定されます。よって、昇順に並べ替えたい場合はASCを指定しなくても大丈夫です。

それでは、具体例を見ていきましょう。

昇順に並び替える方法

昇順に並べ替える方法は2つあります。

1. ASCを指定する方法

カラム名の後にASCを指定することで昇順に並べ替えができます。

SQL
SELECT カラム名
FROM テーブル名
ORDER BY カラム名 ASC;

2. 何も指定しない方法

カラム名の後にASCDESCも指定しない場合は、初期設定で昇順に並べ替えられます。よって、下記のようにORDER BY カラム名とだけ記載した場合は自動で昇順に並べ替えられるのです。

SQL
SELECT カラム名
FROM テーブル名
ORDER BY カラム名;

どっちの書き方でも同じ結果を得られますが、見やすさ観点から明示的にASCを付けること(つまり1の方法)をおすすめします。

サンプルデータ

下記のとおり、usersテーブルを用意します。scoreカラムは試験の点数を表しています。

idnamescore
1山田70
2鈴木56
3佐藤82
4佐々木90
5丸山67
6川島94
usersテーブル

検索クエリ

試験の点数が低い順に並べてレコードを取得する

SQL
SELECT *
FROM users
ORDER BY score ASC;

分かりやすさ重視でASCを指定して、昇順に並べ替えます。

実行結果

idnamescore
2鈴木56
5丸山67
1山田70
3佐藤82
4佐々木90
6川島94
usersテーブル

scoreカラムの値が小さい順にレコードを並び替えることができました。

降順に並び替える方法

降順で並べ替えるためには、DESCを指定します。

SQL
SELECT カラム名
FROM テーブル名
ORDER BY カラム名 DESC;

検索クエリ

先ほどのサンプルデータを用いて、試験の点数が高い順に並べてレコードを取得する

SQL
SELECT *
FROM users
ORDER BY score DESC;

実行結果

idnamescore
6川島94
4佐々木90
3佐藤82
1山田70
5丸山67
2鈴木56
usersテーブル

scoreカラムの値が大きい順にレコードを並び替えることができました。

複数のカラムを指定して並べ替える方法

ここまでは一つのカラムを軸にしてレコードを並べ替える方法を見てきましたが、複数のカラムを指定して並べ替えを行うこともできます。

サンプルデータ

下記のとおり、usersテーブルを用意します。

idnamename_kanascore
1山田yamada90
2鈴木suzuki68
3佐藤sato72
4佐々木sasaki90
5丸山maruyama88
6川島kawashima68
usersテーブル

検索クエリ

試験の点数が高い順かつ、点数が同じ人がいる場合はローマ字順に並び替えてレコードを取得する

SQL
SELECT *
FROM users
ORDER BY score DESC, name_kana ASC;

scoreには降順(DESC)指定、name_kanaには昇順(ASC)指定をしています。これで、点数は高い順かつローマ字はアルファベットのAからという条件になります。

実行結果

idnamename_kanascore
4佐々木sasaki90
1山田yamada90
5丸山maruyama88
3佐藤sato72
6川島kawashima68
2鈴木suzuki68
usersテーブル

scoreカラムが降順に並び替えられていることに加え、scoreが同じ値の場合はname_kanaカラムがローマ字順に並び変わっています。

WHERE句と併用することもできる

ORDER BY句はWHERE句と併用して使うこともできます。実務でクエリを書く時は、頻繁にWHEREと併用することになるでしょう。

サンプルデータ

下記のとおり、usersテーブルを用意します。

idnamescore
1山田88
2鈴木68
3佐藤72
4佐々木90
5丸山96
6川島50
usersテーブル

検索クエリ

試験の点数が80点以上かつ、点数が高い順に並び替えてレコードを取得する

SQL
SELECT *
FROM users
WHERE score >= 80
ORDER BY score DESC;

WHEREで80点以上の条件を指定し、ORDER BYで並べ替えの指定をしています。

実行結果

idnamescore
5丸山96
4佐々木90
1山田88
usersテーブル

点数が80点以上の人に絞られた上で、点数が高い順に並べ替えることができました。

GROUP BY句と併用することもできる

GROUP BY句を併用することで、特定カラムの値ごとにグループ化して、グループに含まれる数を表示する。そして、その数を基準に並べ替えるといったことが可能になります。

少し複雑なので具体例を交えて説明します。

サンプルデータ

idnamescore
1山田88
2鈴木94
3佐藤72
4佐々木88
5丸山72
6川島88
usersテーブル

検索クエリ

得点が同じ人をグルーピングし、同じ得点の人が多い順に並べ替えて取得する

SQL
SELECT
  id,
  name,
  score,
  COUNT(score) AS score_count
FROM users
GROUP BY score
ORDER BY score_count DESC;

順を追って見ていきましょう。

  1. GROUP BY句を使って、scoreをグルーピング(同じ得点の人をグループ化)
  2. COUNT関数を使って、グループごとにデータが何個ずつあるかカウントする
  3. AS句を使って新しいカラムであるscore_countを定義
  4. ORDER BY句を使ってscore_countが多い順に並べ替える

実行結果

idnamescorescore_count
1山田883
3佐藤722
2鈴木941
usersテーブル

88点の人が3名、72点の人が2名、94点の人が1名なので、同じ得点を取っているグループが多い順に並べ替えることができました。

GROUP BY句やCOUNT関数の詳細は下記の記事にまとめているので、チェックしてみてください。

GROUP BY句を使って集計!COUNTやHAVINGとの合わせ技も解説【SQL】 【SQL】COUNT関数でレコード数を取得する

内容のまとめ

  • ORDER BY句を使うことで行(レコード)を小さい順(大きい順)に並べ替えることができる
  • ORDER BY句の基本フォーマットは、ORDER BY カラム名 [ASC | DESC]
  • ASCは昇順(小さいものから大きいもの)に並べ替え、DESCは降順(大きいものから小さいもの)に並べ替えることができる
  • ASCDESCも指定しないと、デフォルでは昇順設定になっている
  • ORDER BY句は複数のカラムを指定して並べ替えたり、WHERE句やGROUP BY句を併用して使うことができる