式とエイリアスで並べ替える
ORDER BYでエイリアスを参照できる場所と、計算ロジックで並べ替える方法を学びます。
「式とエイリアスで並べ替える」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
ORDER BYは思っているより柔軟
驚くほど多くの候補者が、ORDER BYでは通常の列しか参照できないと思っています。実際には、式、エイリアス、列位置、CASEロジックで並べ替えることができます。
面接官がこの点を使うのは、論理的なクエリ実行順序を理解しているかを確認するためです。ORDER BYはSELECTの後に実行されるため、エイリアスをここでは使えますが、WHEREでは使えません。
ORDER BYでエイリアスが使える理由
論理的な実行順序を思い出してください。FROM、WHERE、GROUP BY、HAVING、SELECT、そしてORDER BYの順です。SELECTはORDER BYより先に実行されるため、ORDER BYが評価される時点では、SELECTで定義した列のエイリアスがすでに存在しています。
これが、ORDER BYではエイリアスが使えるのにWHEREでは失敗する正確な理由です。面接官はこの点を実行順序と関連付けてよく質問します。
SELECT name, salary * 12 AS annual_pay
FROM employees
ORDER BY annual_pay DESC;元の式による並べ替え
エイリアスを使わず、完全な式をORDER BYで繰り返すこともできます。どちらも正しく、結果は同じです。
エイリアスを使うほうがすっきりしてロジックの重複も避けられますが、明確さを重視して明示的な式を好むチームもあります。理由を説明できる限り、面接ではどちらの答えでも問題ありません。
SELECT name, salary * 12 AS annual_pay
FROM employees
ORDER BY salary * 12 DESC;列位置(序数)による並べ替え
SELECTリスト項目の序数位置で並べ替えることもできます。ORDER BY 2は、選択した2番目の列で並べ替えます。簡潔ですが、SELECTリストの順序を変更すると並べ替えも予期せず変わるため、壊れやすい書き方です。
面接では、この機能が存在することと、可読性や安全性の観点から本番コードでは一般的に推奨されないことを理解しておきましょう。
SELECT name, hire_date
FROM employees
ORDER BY 2 DESC;計算されたCASEによる並べ替え
強力なパターンの1つが、CASE式による並べ替えで、アルファベット順ではない独自の順序を設定できます。ここでは、導出した優先度を使って高給者を先に表示します。
CASEは、それ自体の列を持たない並べ替え順位を生成し、エンジンは並べ替えのためだけにその値を評価します。
SELECT name, salary
FROM employees
ORDER BY CASE WHEN salary >= 100000 THEN 0 ELSE 1 END,
salary DESC;カテゴリの独自順序による並べ替え
ステータス列は、アルファベット順では適切に並ばないことがほとんどです。「active, pending, closed」はアルファベット順にすると「active, closed, pending」になり、これは正しくありません。CASEを使って各値を意図した順位に対応付けます。
これはレポート作成でよくある要件であり、自然な並べ替え順を超えて順序を制御できることを示すきれいな方法です。
SELECT id, status
FROM orders
ORDER BY CASE status
WHEN 'active' THEN 1
WHEN 'pending' THEN 2
WHEN 'closed' THEN 3
ELSE 4
END;関数の結果による並べ替え
スカラー関数なら、どれでもORDER BYで使えます。たとえば、LOWERで大文字と小文字を区別せずに並べ替えたり、文字列の長さや日付の一部で並べ替えたりできます。
注意点として、並べ替えの際に列を関数でラップすると、WHEREの場合と同様に、エンジンがその列のインデックスを使えなくなることがあります。
SELECT name
FROM employees
ORDER BY LOWER(name) ASC;GROUP BYクエリでのエイリアスと集約関数
グループ化したクエリでは、集約関数の結果で並べ替えることがよくあります。ここでもSELECTが先に実行されるため、ORDER BYで集約結果のエイリアスを参照できます。
次のクエリは顧客ごとの注文数を数え、その数を降順に並べ替えています。並べ替えにはorder_countというエイリアスを使っています。
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
ORDER BY order_count DESC;エイリアス名の衝突に関する注意点
面接官が好んで出す境界例があります。エイリアスが実際の列と同じ名前だったらどうなるでしょうか。多くのエンジンでは、ORDER BYの裸の名前はまずSELECTリストのエイリアスとして解決されるため、意外な結果になることがあります。
salary * 2 AS salaryとエイリアスを付けてからORDER BY salaryとすると、元の列ではなく、2倍した値で並べ替えられます。この曖昧さを避けるため、列名をエイリアスとして再利用しないでください。
SELECT salary * 2 AS salary
FROM employees
ORDER BY salary;式と並べ替え方向の組み合わせ
これらをすべて1つの句で組み合わせることができます。式、エイリアス、通常の列を順に指定し、それぞれに独自の並べ替え方向を設定できます。この例では、計算したボーナス区分を降順に並べ替え、同順位時の判定として名前を昇順にしています。
このようにキーを重ねて指定することは、実際のレポート用クエリの基本です。
SELECT name, salary,
salary * 0.1 AS bonus
FROM employees
ORDER BY bonus DESC, name ASC;移植性に関する注意点
ORDER BYでの式やエイリアスは広くサポートされていますが、面接では次の点にも注意してください。
- 序数位置(
ORDER BY 2)は標準的ですが、推奨されません。 ORDER BYでのエイリアスの可視性は主要なエンジン間で一貫していますが、WHERE/HAVINGでは一貫していません。SELECT DISTINCTには制約があり、ORDER BYで指定できるのはSELECTリストに含まれる式だけです。
クイックチェック
エイリアスの可視性と実行順序を関連付けて考えます。
まとめ
式とエイリアスによる並べ替え:
ORDER BYでは、エイリアス、そのままの式、関数、CASEロジック、序数位置を使用できます。- 論理的な実行順序では、
ORDER BYは 後にSELECTが実行されるため、エイリアスが機能します。 - 独自のカテゴリ順には
CASEを使用します。 - 曖昧さを避けるため、実際の列と衝突するエイリアス名は避けます。
- ソートキー内の関数によって、インデックスが使われなくなることがあります。
よくある質問
「式とエイリアスで並べ替える」レッスンは無料ですか?
はい。「式とエイリアスで並べ替える」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「式とエイリアスで並べ替える」で何を学びますか?
ORDER BYでエイリアスを参照できる場所と、計算ロジックで並べ替える方法を学びます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「式とエイリアスで並べ替える」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 複数列の並べ替えとNULLの配置
- LIMIT、OFFSET、FETCH FIRST
- 上位N行を確実に返す
- 式とエイリアスで並べ替える