概要(ORDER BY は「結果の並び順を決めるスイッチ」)
SQL の ORDER BY 句は、SELECT で取り出した結果を「どんな順番で並べるか」を指定するための仕組みです。
「年齢の若い順に」「価格の高い順に」「名前の五十音順に」といった並び替えを、データベース側でやってもらうためのコマンドだと思ってください。
ORDER BY を理解すると、同じデータでも「見たい形」に整えて取り出せるようになります。
Django の order_by() が裏でやっていることも、ほぼこれです。
ORDER BY の基本形と昇順・降順
基本構文
一番シンプルな形は次の通りです。
SELECT 列1, 列2
FROM テーブル名
ORDER BY 並べたい列 [ASC | DESC];
SQLASC は昇順(小さい→大きい、あ→ん)、DESC は降順(大きい→小さい、ん→あ)です。
ASC は省略可能で、書かなければ「昇順」がデフォルトになります。
例えば、次の users テーブルを考えます。
users テーブル
id | name | age
---+--------+----
1 | Taro | 25
2 | Hanako | 30
3 | Ken | 19
年齢の若い順に並べたいときはこうです。
SELECT name, age
FROM users
ORDER BY age ASC;
SQL結果は次のようになります。
name | age
-------+----
Ken | 19
Taro | 25
Hanako | 30
年齢の高い順にしたいときは DESC を使います。
SELECT name, age
FROM users
ORDER BY age DESC;
SQLWHERE と ORDER BY の組み合わせ(「絞ってから並べる」)
処理の順番のイメージ
SELECT 文の流れは、ざっくり言うと「FROM → WHERE → ORDER BY」です。
つまり、まずテーブルから行を集め、WHERE で条件に合う行だけに絞り、そのあと ORDER BY で並び替えます。
例えば、「20 歳以上のユーザーだけを、年齢の高い順に並べたい」場合はこうなります。
SELECT name, age
FROM users
WHERE age >= 20
ORDER BY age DESC;
SQLここで大事なのは、「WHERE で対象を絞ってから ORDER BY で並べる」という意識です。
ORDER BY だけでは行は減らず、「順番だけ」が変わります。
複数列での並び替え(優先順位をつける)
「まず年齢、その中で名前」のような並び
ORDER BY は、カンマで複数の列を指定できます。
これにより、「優先順位付きの並び替え」ができます。
例えば、「年齢の高い順、同じ年齢なら名前の昇順」にしたい場合はこうです。
SELECT name, age
FROM users
ORDER BY age DESC, name ASC;
SQLこのクエリの意味は次の通りです。
まず age で降順に並べる。
同じ age 同士のグループの中では、name を昇順に並べる。
結果のイメージはこうなります。
name | age
-------+----
Hanako | 30
Taro | 25
Ken | 19
もし 25 歳が 2 人いた場合、その 2 人は名前順で並びます。
「どの列を第一優先にするか」「第二優先にするか」を ORDER BY の並び順で決める、という感覚を持つと分かりやすいです。
数値・文字列・日付での並び方の違い
数値は「小さい順・大きい順」
age や price のような数値カラムは、
ASC なら小さい値から大きい値へ、DESC ならその逆です。
SELECT name, price
FROM products
ORDER BY price ASC;
SQLこれは「安い順」、DESC にすれば「高い順」です。
文字列は「辞書順」
name や email のような文字列カラムは、
基本的に「辞書順(アルファベット順・五十音順)」で並びます。
SELECT name
FROM users
ORDER BY name ASC;
SQLこのとき、「A → B → C」「あ → い → う」のような順番になります。
大文字・小文字の扱いや、日本語の細かい順序はデータベースや照合順序(COLLATION)の設定に依存しますが、
初心者のうちは「文字列は辞書順」と覚えておけば十分です。
日付は「古い順・新しい順」
created_at のような日付カラムは、
ASC なら古い日付から新しい日付へ、DESC なら新しい日付から古い日付へ並びます。
SELECT title, created_at
FROM posts
ORDER BY created_at DESC;
SQLこれは「新着順」の典型パターンです。
Web アプリでよく見る「最新の投稿から表示」は、ほぼ必ずこの ORDER BY が裏で動いています。
LIMIT と組み合わせて「上位 N 件だけ」を取る
ORDER BY と LIMIT のセットは超よく使う
ORDER BY は、LIMIT と組み合わせると一気に実戦的になります。
例えば、「年齢の高い順に上位 3 人だけ欲しい」ならこうです。
SELECT name, age
FROM users
ORDER BY age DESC
LIMIT 3;
SQL処理のイメージは次の通りです。
まず全行を age の降順で並べる。
その中から先頭 3 行だけを返す。
「最新 10 件」「売上トップ 5 件」「いいね数が多い順に 20 件」など、
現場でよく見るランキング系・新着系の画面は、
ほぼこの ORDER BY + LIMIT で実現されています。
実務で意識したい ORDER BY の考え方
「並び順を決めないと、順番は保証されない」と思っておく
多くのデータベースでは、ORDER BY を書かない限り、
行の返ってくる順番は「たまたまそうなっているだけ」で、保証されません。
たまたま id の昇順に見えていても、
インデックスやデータ量が変わると、ある日突然順番が変わることがあります。
「この画面は新しい順に見せたい」
「この一覧は名前順で見せたい」
といった要件があるなら、
必ず ORDER BY を明示的に書く、という癖をつけてください。
「何を基準に並べたいか」を日本語で言ってから書く
ORDER BY を書く前に、一度日本語で言語化してみると、迷いにくくなります。
例えば、
「年齢の高い順に、同じ年齢なら名前の昇順で並べたい」
これをそのまま SQL に写すと、
第一優先:age を降順 → ORDER BY age DESC
第二優先:name を昇順 → , name ASC
となり、最終的にこうなります。
ORDER BY age DESC, name ASC;
SQLORDER BY は「並び替えのルールを、左から順に書いていく場所」だと捉えると、
複数列のソートも怖くなくなります。
まとめ(ORDER BY は「見せ方」を決める最後の一手)
ORDER BY を初心者目線でまとめると、こうなります。
結果の「並び順」を決めるのが ORDER BY で、ASC(昇順)と DESC(降順)を使い分ける。
複数列を指定すると、「第一優先・第二優先…」という形でソートルールを重ねられる。
数値は小さい順/大きい順、文字列は辞書順、日付は古い順/新しい順で並ぶ。
ORDER BY と LIMIT を組み合わせると、「新着 10 件」「ランキング上位 5 件」などが簡単に書ける。
ORDER BY を書かない限り、行の順番は保証されないので、「順番に意味がある画面」では必ず明示的に書く。
