データベースを使ってると、データに順番が欲しくなることが多いよね。例えば:
- 「一番高い商品トップ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クエリを書くための半分の成功だよ。次のテーマもがんばろう!😉
GO TO FULL VERSION