CodeGym /コース /SQL SELF /データのソート(ORDER BY):昇順・降順ソート(ASC, DESC)

データのソート(ORDER BY):昇順・降順ソート(ASC, DESC)

SQL SELF
レベル 2, レッスン 3
使用可能

データベースを使ってると、データに順番が欲しくなることが多いよね。例えば:

  • 「一番高い商品トップ10を見せて」
  • 「どの注文が一番新しい?」
  • 「生徒の年齢を若い順で並べて」

データを並べたいって気持ちはめっちゃ自然なこと。どんなにスーパーなプログラマーでも、ぐちゃぐちゃなデータを読むのはダルいよね。だからこそ、SQLには結果セットの行を並べ替えるための ORDER BY っていう便利な道具があるんだ。

ORDER BY の基本

ORDER BY は、結果セットの行を好きな順番にできる魔法のステートメント。これがないと、データは「適当な」順番で返ってくる(これはDBのバグじゃなくて、順番が保証されてないだけ)。

ORDER BY の書き方はこんな感じ:

SELECT カラム1, カラム2
FROM テーブル
ORDER BY カラム1 DESC;
  • カラム1: ソートしたいカラム名。
  • ASC: 昇順ソート(デフォルト値だから省略OK)。
  • DESC: 降順ソート。

例

例えば、students っていうテーブルがあるとする:

id name age
1 Alex 22
2 Maria 19
3 Otto 21

生徒を年齢順(昇順)で並べてみよう:

SELECT name, age
FROM students
ORDER BY age ASC;

結果:

name age
Maria 19
Otto 21
Alex 22

もし降順にしたいなら:

SELECT name, age
FROM students
ORDER BY age DESC;

結果はこうなる:

name age
Alex 22
Otto 21
Maria 19

複数カラムでのソート

ソートに1つのカラムだけじゃ足りない時もあるよね。例えば、同じ年齢の生徒が複数いる場合、さらに名前順で並べたいとか。

複数カラムでのソートはこうやる:

SELECT カラム1, カラム2
FROM テーブル
ORDER BY カラム1 DESC, カラム2 ASC;

次のテーブルで例を見てみよう:

id name age
1 Alex 22
2 Maria 19
3 Otto 21
4 Anna 19

クエリ:

SELECT name, age
FROM students
ORDER BY age ASC, name ASC;

結果:

name age
Anna 19
Maria 19
Otto 21
Alex 22

まず年齢(昇順)で並べて、同じ年齢の中では名前のアルファベット順になるよ。

エイリアスでのソート

カラムにエイリアス(別名)をつけてる場合、そのエイリアスでもソートできるよ。

SELECT name AS "名前", age AS "年齢"
FROM students
ORDER BY "年齢" DESC;

結果:

名前 年齢
Alex 22
Otto 21
Maria 19

これが大事なのは、昔は計算カラムでソートするのが面倒だったからなんだ。

計算カラムでのソート

SQLではクエリ内で計算して、その結果でソートすることもできるよ。

例1.シンプルな計算

SELECT name, age, age * 2 AS doubled_age
FROM students
ORDER BY doubled_age DESC;

結果:

name age doubled_age
Alex 22 44
Otto 21 42
Maria 19 38

例2.関数の利用 例えば、products テーブルに商品の価格が入ってるとする:

product_name price
商品A 100
商品B 200
商品C 150

今度は、価格を0.9倍して四捨五入した値(例えば割引後の価格)でソートしてみよう。ROUND 関数は小数点以下を丸めてくれるよ。

SELECT product_name, price, ROUND(price * 0.9, 1) AS discounted_price
FROM products
ORDER BY discounted_price ASC;

結果はこんな感じ:

product_name price discounted_price
商品A 100 90
商品C 150 135
商品B 200 180

ソートの実践的な使い道

ソートはこんな場面で超重要:

  • レポート作成、例えば月間売上トップ10とか。
  • UIにデータを出す時、例えば注文リストを日付順に並べるとか。
  • 分析用リスト作成、例えば優先度ごとにグループ分けとか。

ORDER BY でよくあるミス

ミスはどこでも起こるもの。気をつけたいポイントをいくつか挙げるね:

  • 存在しないカラムでソートしようとすると、column "not_a_column" does not exist ってエラーになる。
  • 計算カラムのエイリアスでソートする時、エイリアスが上位レベルで定義されてると混乱しやすい。
  • ソート順をうっかり書き忘れると、PostgreSQLはデフォルトで ASC を使う。これはエラーじゃないけど、思わぬ結果になることも。

これでPostgreSQLの ORDER BY でソートをコントロールできるようになったね。データをちゃんと整理するのは、効率的なSQLクエリを書くための半分の成功だよ。次のテーマもがんばろう!😉

2
タスク
SQL SELF, レベル 2, レッスン 3
ロック未解除
昇順でのソート
昇順でのソート
2
タスク
SQL SELF, レベル 2, レッスン 3
ロック未解除
降順でのソート
降順でのソート
1
アンケート/クイズ
SQLへのイントロ、レベル 2、レッスン 3
使用不可
SQLへのイントロ
SQLへのイントロ
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION