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関数の詳細は下記の記事にまとめているので、チェックしてみてください。
GROUP BY句を使って集計!COUNTやHAVINGとの合わせ技も解説【SQL】 【SQL】COUNT関数でレコード数を取得する内容のまとめ
- ORDER BY句を使うことで行(レコード)を小さい順(大きい順)に並べ替えることができる
- ORDER BY句の基本フォーマットは、
ORDER BY カラム名 [ASC | DESC]
ASC
は昇順(小さいものから大きいもの)に並べ替え、DESC
は降順(大きいものから小さいもの)に並べ替えることができるASC
もDESC
も指定しないと、デフォルでは昇順設定になっている- ORDER BY句は複数のカラムを指定して並べ替えたり、WHERE句やGROUP BY句を併用して使うことができる