SQLでデータを取得した時、「新しい順に並べたい」「スコアの高い順に表示したい」と思ったことはありませんか?
そんな時に使うのがORDER BY(オーダー・バイ)
句です。
この記事では、ORDER BYの基本的な使い方から、昇順・降順、複数カラムでの並び替えまで、初心者にもわかりやすく解説します。
ORDER BY句ってなに?

ORDER BY句の役割
ORDER BY
句は、SQLの結果セットを特定の列で「並び替え」るために使います。
データを見やすい順序で表示したい時に必須の機能です。
基本的な書き方
SELECT カラム名 FROM テーブル名 ORDER BY 並び替えたい列;
SQLの文の順番
SELECT カラム名
FROM テーブル名
WHERE 条件
ORDER BY 並び替えたい列
LIMIT 件数;
ORDER BYは通常、SELECT文の最後に記述します。
実際の使用例
-- 学生の成績を点数順に表示
SELECT name, score FROM students ORDER BY score;
-- 商品を価格順に表示
SELECT name, price FROM products ORDER BY price;
-- 従業員を入社日順に表示
SELECT name, hire_date FROM employees ORDER BY hire_date;
結果のイメージ(score順)
name | score
---------|------
田中太郎 | 65
佐藤花子 | 78
山田次郎 | 85
鈴木美咲 | 92
ポイント
- データベースの標準では昇順(小さい値から大きい値へ)で並ぶ
- 数値、日付、文字列すべてに使える
- 結果の見た目が整理されて見やすくなる
まずは構文を覚えて、シンプルな並び替えができるようになりましょう。
次は、昇順・降順の指定について見ていきます。
ASCとDESCで並び順を指定しよう
昇順と降順の指定
- ASC(Ascending):昇順(小さい順、古い順)※省略可能
- DESC(Descending):降順(大きい順、新しい順)
実際の使用例
-- 昇順:最も安い商品が上に表示
SELECT name, price FROM products ORDER BY price ASC;
-- 降順:最も高い商品が上に表示
SELECT name, price FROM products ORDER BY price DESC;
-- 昇順:古い注文から順番に表示
SELECT order_id, order_date FROM orders ORDER BY order_date ASC;
-- 降順:新しい注文から順番に表示
SELECT order_id, order_date FROM orders ORDER BY order_date DESC;
結果の比較
昇順(ASC)の場合:
name | price
----------|------
ノート | 100
ペン | 150
消しゴム | 200
降順(DESC)の場合:
name | price
----------|------
消しゴム | 200
ペン | 150
ノート | 100
データ型別の並び順
数値の場合
- 昇順(ASC):1, 2, 3, 10, 20, 100…
- 降順(DESC):100, 20, 10, 3, 2, 1…
日付の場合
- 昇順(ASC):古い日付 → 新しい日付
- 降順(DESC):新しい日付 → 古い日付
文字列の場合
- 昇順(ASC):あいうえお順、ABC順
- 降順(DESC):逆順(をわらやま…、ZYX…)
ポイント
- ASCは省略可能(何も書かなければ昇順)
- DESCは省略不可(必ず明記する)
- 目的に応じて使い分ける
並び順を明示することで、意図した表示が可能になります。
次は、複数の列を使った並び替えについて紹介します。
複数のカラムで並び替えよう

複数カラム並び替えの仕組み
ORDER BY
句では、複数の列を指定して優先順位付きで並べることができます。最初の列で並べた後、同じ値の場合に次の列で並べます。
基本的な書き方
SELECT カラム名 FROM テーブル名
ORDER BY 第1優先列, 第2優先列, 第3優先列...;
実際の使用例
-- 学年で昇順に並べ、その中でスコアの高い順に表示
SELECT name, grade, score FROM students
ORDER BY grade ASC, score DESC;
-- 部署別に並べ、その中で給与の高い順に表示
SELECT name, department, salary FROM employees
ORDER BY department ASC, salary DESC;
-- カテゴリ別に並べ、その中で価格の安い順に表示
SELECT name, category, price FROM products
ORDER BY category ASC, price ASC;
結果のイメージ
name | grade | score
---------|-------|------
田中太郎 | 1年 | 95
佐藤花子 | 1年 | 88
山田次郎 | 1年 | 75
鈴木美咲 | 2年 | 92
高橋一郎 | 2年 | 85
複雑な例
-- 地域別 → 売上高い順 → 同じ売上なら名前順
SELECT store_name, region, sales FROM stores
ORDER BY region ASC, sales DESC, store_name ASC;
それぞれの列で異なる並び順を指定
-- 部署は昇順、給与は降順、名前は昇順
SELECT name, department, salary FROM employees
ORDER BY department ASC, salary DESC, name ASC;
ポイント
- 左から右へ優先順位が決まる
- 各列ごとに ASC/DESC を個別指定可能
- 同じ値の行がある時に次の列で並び替え
複数カラムの並び替えは、細かい表示制御にとても便利です。
次は、並び替えと他の句との組み合わせについて見てみましょう。
ORDER BYとLIMITを組み合わせよう

ORDER BYとLIMITの組み合わせ
ORDER BY
は、LIMIT
と組み合わせることで「上位○件のデータ」や「最新○件のデータ」などを簡単に取得できます。
基本的な書き方
SELECT カラム名 FROM テーブル名
ORDER BY 並び替え列
LIMIT 件数;
実際の使用例
-- 上位5位のスコア
SELECT name, score FROM students
ORDER BY score DESC LIMIT 5;
-- 最新5件の注文
SELECT order_id, order_date, customer_name FROM orders
ORDER BY order_date DESC LIMIT 5;
-- 最も安い3つの商品
SELECT name, price FROM products
ORDER BY price ASC LIMIT 3;
-- 給与トップ10の社員
SELECT name, department, salary FROM employees
ORDER BY salary DESC LIMIT 10;
OFFSETと組み合わせたページング
-- 6位から10位のスコア(2ページ目の表示)
SELECT name, score FROM students
ORDER BY score DESC LIMIT 5 OFFSET 5;
-- 11位から15位のスコア(3ページ目の表示)
SELECT name, score FROM students
ORDER BY score DESC LIMIT 5 OFFSET 10;
結果のイメージ(上位3位)
name | score
---------|------
鈴木美咲 | 95
山田次郎 | 92
佐藤花子 | 88
活用場面
- ランキング表示:売上トップ10、人気商品ベスト5など
- 最新情報:最新の投稿、直近の取引など
- ページング:検索結果の1ページ目、2ページ目など
- 異常値検出:最も高い値、最も低い値など
ポイント
- ORDER BYで並べてからLIMITで件数制限
- 順序が重要:ORDER BY → LIMIT の順番
- ページング機能の実装に便利
ランキングや最新データの表示に最適な構文です。
次に、ORDER BY使用時の注意点を紹介します。
ORDER BY使用時の注意点
NULL値の扱い
NULL値がある列で並び替えを行う場合、データベースによって扱いが異なります。
一般的なルール
- 昇順(ASC):NULLは通常、最後に表示される
- 降順(DESC):NULLは通常、最初に表示される
実例
-- scoreにNULLが含まれる場合
SELECT name, score FROM students ORDER BY score ASC;
結果例:
name | score
---------|------
田中太郎 | 65
佐藤花子 | 78
山田次郎 | 85
高橋一郎 | NULL
鈴木美咲 | NULL
NULL値の位置を明示的に指定(PostgreSQL)
-- NULLを最初に表示
SELECT name, score FROM students ORDER BY score ASC NULLS FIRST;
-- NULLを最後に表示
SELECT name, score FROM students ORDER BY score DESC NULLS LAST;
SQLの文の順序
ORDER BYの位置は決まっています。以下の順序を守りましょう。
SELECT カラム名
FROM テーブル名
WHERE 条件
GROUP BY グループ化列
HAVING グループ条件
ORDER BY 並び替え列
LIMIT 件数;
パフォーマンスの考慮
インデックスの活用
-- インデックスがある列での並び替えは高速
CREATE INDEX idx_score ON students(score);
SELECT name, score FROM students ORDER BY score DESC;
-- 複数列のインデックス
CREATE INDEX idx_grade_score ON students(grade, score);
SELECT name, grade, score FROM students ORDER BY grade, score DESC;
大量データでの注意点
-- ❌ 大量データで全件ソートは重い
SELECT * FROM large_table ORDER BY some_column;
-- ✅ LIMITと組み合わせて件数を制限
SELECT * FROM large_table ORDER BY some_column LIMIT 100;
よくある間違い
間違い1:ORDER BYの位置
-- ❌ 間違い:ORDER BYがWHEREより前
SELECT name, score FROM students ORDER BY score WHERE grade = 'A';
-- ✅ 正しい:WHERE句の後にORDER BY
SELECT name, score FROM students WHERE grade = 'A' ORDER BY score;
間違い2:存在しない列での並び替え
-- ❌ 間違い:SELECTに含まれていない列は使えない場合がある
SELECT name FROM students ORDER BY score;
-- ✅ 正しい:並び替えに使う列もSELECTに含める
SELECT name, score FROM students ORDER BY score;
ポイント
- NULL値の扱いを理解しておく
- SQLの文の順序を守る
- 大量データではパフォーマンスに注意
- インデックスを活用する
正確な結果を得るには、並び順とデータの性質を理解しておくことが大切です。
まとめ
SQLのORDER BY
句は、データを希望通りの順序で表示するために欠かせない構文です。
覚えるべきポイント
- 基本構文:
SELECT カラム名 FROM テーブル名 ORDER BY 列名
- 並び順指定:ASC(昇順)、DESC(降順)
- 複数カラム:優先順位を付けて複数の列で並び替え
- LIMITとの組み合わせ:上位○件、最新○件の取得
実務での活用場面
- ランキング表示:売上ランキング、人気商品一覧
- 時系列データ:最新の投稿、過去の履歴
- レポート作成:部署別集計、カテゴリ別一覧
- 検索結果:関連度順、価格順、評価順
よく使われるパターン
-- ランキング(上位5位)
SELECT name, sales FROM salesmen ORDER BY sales DESC LIMIT 5;
-- 最新情報(直近10件)
SELECT title, created_at FROM posts ORDER BY created_at DESC LIMIT 10;
-- カテゴリ別一覧
SELECT category, name, price FROM products ORDER BY category, price ASC;
コメント