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の商品を結果の最後に表示する場面。

Try It — SQL Formatter

フルツールを開く