SQL ORDER BYによるソートとランキング
SQL ORDER BYで1つ以上のカラムを昇順・降順にソートする方法をマスター。NULLS FIRST/LAST、式によるソート、カスタム順序指定も解説します。
Query
詳細な説明
SQL ORDER BYによるソートとランキング
ORDER BY 句は結果セットを1つ以上のカラムまたは式でソートします。ORDER BYがない場合、データベースは行の順序を一切保証しません。
基本構文
SELECT name, salary, hire_date
FROM employees
ORDER BY salary DESC, hire_date ASC;
ASC(昇順)がデフォルトです。DESC は降順にソートします。
複数カラムによるソート
複数カラムでソートする場合、各カラムは前のカラムの同一値グループ内でサブソートを定義します:
SELECT * FROM products
ORDER BY category ASC, price DESC, name ASC;
商品はまずcategoryのアルファベット順でグループ化され、各カテゴリ内ではpriceの高い順、同じ価格の商品はnameの昇順でソートされます。
式によるソート
SELECT name, price, discount
FROM products
ORDER BY price * (1 - discount) ASC;
計算値、関数の結果、またはCASE式でソートできます。
NULLの順序
データベースによってNULLのソート順が異なります。サポートされている場合は明示的に制御しましょう:
-- PostgreSQL / Oracle
SELECT * FROM contacts
ORDER BY phone NULLS LAST;
-- MySQL の代替方法
SELECT * FROM contacts
ORDER BY phone IS NULL, phone;
CASEによるカスタムソート
SELECT * FROM tickets
ORDER BY
CASE priority
WHEN 'critical' THEN 1
WHEN 'high' THEN 2
WHEN 'medium' THEN 3
WHEN 'low' THEN 4
END;
カラム位置によるソート
SELECT name, department, salary
FROM employees
ORDER BY 2, 3 DESC;
位置指定によるソートは動作しますが、脆弱でメンテナンスが困難です。可読性のためにカラム名を使用しましょう。
パフォーマンスに関する考慮事項
- インデックスが設定されたカラムでのORDER BYは大幅に高速化される
- インデックスなしの大規模結果セットのソートは一時ファイルソートが必要
LIMITをORDER BYと組み合わせると、オプティマイザがtop-Nソートを使用でき、結果セット全体のソートよりも効率的- LIMITやOFFSETが必要な場合を除き、サブクエリ内でのORDER BYは避ける
ORDER BYはデータを予測可能でユーザーフレンドリーな順序で表示するために不可欠であり、ページネーションのためにLIMITと組み合わせて使用されることが多いです。
ユースケース
商品一覧ページが、価格、評価、新着順での複数条件ソートを実装し、評価がNULLの商品を結果の最後に表示する場面。