SQLで行(レコード)を並べ替えたい時は、ORDER BY句を使います。
ORDER BY句を使うことで、IDが小さい順(大きい順)に行を並べ替えるといった処理を実現できます。
本記事では、ORDER BY句の使い方について詳しく解説していきます。
目次
ORDER BY句の使い方
ORDER BY句の基本構文は下記です。
SELECT カラム名
FROM テーブル名
ORDER BY カラム名 [ASC | DESC], カラム名 [ASC | DESC], ...並べ替えを指定しているのは下記の部分です。
ORDER BY カラム名 [ASC | DESC]
ORDER BYの後に並べ替えの条件となるカラム名を指定し、その後にASCもしくはDESCを指定します。
ASCとDESCはそれぞれ並べ替えの条件を意味しています。
| クエリ | 条件 |
|---|---|
| ASC | 昇順(小さいものから大きいもの)に並び替える |
| DESC | 降順(大きいものから小さいもの)に並び替える |
何も指定しないとデフォルトで昇順が指定されます。よって、昇順に並べ替えたい場合はASCを指定しなくても大丈夫です。
それでは、具体例を見ていきましょう。
昇順に並び替える方法
昇順に並べ替える方法は2つあります。
1. ASCを指定する方法
カラム名の後にASCを指定することで昇順に並べ替えができます。
SELECT カラム名
FROM テーブル名
ORDER BY カラム名 ASC;2. 何も指定しない方法
カラム名の後にASCもDESCも指定しない場合は、初期設定で昇順に並べ替えられます。よって、下記のようにORDER BY カラム名とだけ記載した場合は自動で昇順に並べ替えられるのです。
SELECT カラム名
FROM テーブル名
ORDER BY カラム名;どっちの書き方でも同じ結果を得られますが、見やすさ観点から明示的にASCを付けること(つまり1の方法)をおすすめします。
サンプルデータ
下記のとおり、usersテーブルを用意します。scoreカラムは試験の点数を表しています。
| id | name | score |
|---|---|---|
| 1 | 山田 | 70 |
| 2 | 鈴木 | 56 |
| 3 | 佐藤 | 82 |
| 4 | 佐々木 | 90 |
| 5 | 丸山 | 67 |
| 6 | 川島 | 94 |
検索クエリ
試験の点数が低い順に並べてレコードを取得する
SELECT *
FROM users
ORDER BY score ASC;分かりやすさ重視でASCを指定して、昇順に並べ替えます。
実行結果
| id | name | score |
|---|---|---|
| 2 | 鈴木 | 56 |
| 5 | 丸山 | 67 |
| 1 | 山田 | 70 |
| 3 | 佐藤 | 82 |
| 4 | 佐々木 | 90 |
| 6 | 川島 | 94 |
scoreカラムの値が小さい順にレコードを並び替えることができました。
降順に並び替える方法
降順で並べ替えるためには、DESCを指定します。
SELECT カラム名
FROM テーブル名
ORDER BY カラム名 DESC;検索クエリ
先ほどのサンプルデータを用いて、試験の点数が高い順に並べてレコードを取得する
SELECT *
FROM users
ORDER BY score DESC;実行結果
| id | name | score |
|---|---|---|
| 6 | 川島 | 94 |
| 4 | 佐々木 | 90 |
| 3 | 佐藤 | 82 |
| 1 | 山田 | 70 |
| 5 | 丸山 | 67 |
| 2 | 鈴木 | 56 |
scoreカラムの値が大きい順にレコードを並び替えることができました。
複数のカラムを指定して並べ替える方法
ここまでは一つのカラムを軸にしてレコードを並べ替える方法を見てきましたが、複数のカラムを指定して並べ替えを行うこともできます。
サンプルデータ
下記のとおり、usersテーブルを用意します。
| id | name | name_kana | score |
|---|---|---|---|
| 1 | 山田 | yamada | 90 |
| 2 | 鈴木 | suzuki | 68 |
| 3 | 佐藤 | sato | 72 |
| 4 | 佐々木 | sasaki | 90 |
| 5 | 丸山 | maruyama | 88 |
| 6 | 川島 | kawashima | 68 |
検索クエリ
試験の点数が高い順かつ、点数が同じ人がいる場合はローマ字順に並び替えてレコードを取得する
SELECT *
FROM users
ORDER BY score DESC, name_kana ASC;scoreには降順(DESC)指定、name_kanaには昇順(ASC)指定をしています。これで、点数は高い順かつローマ字はアルファベットのAからという条件になります。
実行結果
| id | name | name_kana | score |
|---|---|---|---|
| 4 | 佐々木 | sasaki | 90 |
| 1 | 山田 | yamada | 90 |
| 5 | 丸山 | maruyama | 88 |
| 3 | 佐藤 | sato | 72 |
| 6 | 川島 | kawashima | 68 |
| 2 | 鈴木 | suzuki | 68 |
scoreカラムが降順に並び替えられていることに加え、scoreが同じ値の場合はname_kanaカラムがローマ字順に並び変わっています。
WHERE句と併用することもできる
ORDER BY句はWHERE句と併用して使うこともできます。実務でクエリを書く時は、頻繁にWHEREと併用することになるでしょう。
サンプルデータ
下記のとおり、usersテーブルを用意します。
| id | name | score |
|---|---|---|
| 1 | 山田 | 88 |
| 2 | 鈴木 | 68 |
| 3 | 佐藤 | 72 |
| 4 | 佐々木 | 90 |
| 5 | 丸山 | 96 |
| 6 | 川島 | 50 |
検索クエリ
試験の点数が80点以上かつ、点数が高い順に並び替えてレコードを取得する
SELECT *
FROM users
WHERE score >= 80
ORDER BY score DESC;WHEREで80点以上の条件を指定し、ORDER BYで並べ替えの指定をしています。
実行結果
| id | name | score |
|---|---|---|
| 5 | 丸山 | 96 |
| 4 | 佐々木 | 90 |
| 1 | 山田 | 88 |
点数が80点以上の人に絞られた上で、点数が高い順に並べ替えることができました。
GROUP BY句と併用することもできる
GROUP BY句を併用することで、特定カラムの値ごとにグループ化して、グループに含まれる数を表示する。そして、その数を基準に並べ替えるといったことが可能になります。
少し複雑なので具体例を交えて説明します。
サンプルデータ
| id | name | score |
|---|---|---|
| 1 | 山田 | 88 |
| 2 | 鈴木 | 94 |
| 3 | 佐藤 | 72 |
| 4 | 佐々木 | 88 |
| 5 | 丸山 | 72 |
| 6 | 川島 | 88 |
検索クエリ
得点が同じ人をグルーピングし、同じ得点の人が多い順に並べ替えて取得する
SELECT
id,
name,
score,
COUNT(score) AS score_count
FROM users
GROUP BY score
ORDER BY score_count DESC;順を追って見ていきましょう。
- GROUP BY句を使って、
scoreをグルーピング(同じ得点の人をグループ化) - COUNT関数を使って、グループごとにデータが何個ずつあるかカウントする
- AS句を使って新しいカラムである
score_countを定義 - ORDER BY句を使って
score_countが多い順に並べ替える
実行結果
| id | name | score | score_count |
|---|---|---|---|
| 1 | 山田 | 88 | 3 |
| 3 | 佐藤 | 72 | 2 |
| 2 | 鈴木 | 94 | 1 |
88点の人が3名、72点の人が2名、94点の人が1名なので、同じ得点を取っているグループが多い順に並べ替えることができました。
GROUP BY句やCOUNT関数の詳細は下記の記事にまとめているので、チェックしてみてください。
内容のまとめ
- ORDER BY句を使うことで行(レコード)を小さい順(大きい順)に並べ替えることができる
- ORDER BY句の基本フォーマットは、
ORDER BY カラム名 [ASC | DESC] ASCは昇順(小さいものから大きいもの)に並べ替え、DESCは降順(大きいものから小さいもの)に並べ替えることができるASCもDESCも指定しないと、デフォルでは昇順設定になっている- ORDER BY句は複数のカラムを指定して並べ替えたり、WHERE句やGROUP BY句を併用して使うことができる

