複数列の並べ替えとNULLの配置
ASCとDESCの組み合わせ方、またデータベースごとのNULLS FIRST/LASTの違いを学びます。
「複数列の並べ替えとNULLの配置」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
ソートが面接で取り上げられる理由
面接官が早い段階でORDER BYを取り上げるのは、SQLの結果セットがデフォルトでは順序付けられていないことを理解しているか確認できるためです。明示的にソートしなければ、データベースは好きな順序で行を返せます。
よくある導入質問は、「行が特定の順序で返されることをどのように保証しますか?」です。唯一の正しい答えは、明示的なORDER BY句です。挿入順、主キー順、またはインデックス順に依存するのは、初級者によくある間違いです。
このレッスンでは、複数列のソートと、NULL値がどこに配置されるかという難しい問題を習得します。
ASCとDESCの基本
ORDER BYはデフォルトで昇順(ASC)にソートします。逆順にする場合だけDESCが必要です。方向は句全体ではなく、列ごとに適用されます。
面接のポイント: ASCは暗黙のデフォルトなので、記述しなくてもよいと説明しましょう。多くの候補者は、1つのDESCですべての列が反転すると誤解しています。
SELECT name, hire_date
FROM employees
ORDER BY hire_date DESC;複数列でのソート
複数の列をカンマで区切って指定します。SQLは最初の列でソートし、同値の行を2番目の列で区別し、それ以降も同様に処理します。タイブレークの連鎖として考えるとよいでしょう。
この例では、部署をアルファベット順にソートし、各部署内では給与の高い順にソートしています。
- 主ソート:
departmentの昇順 - タイブレーカー:
salaryの降順
SELECT department, name, salary
FROM employees
ORDER BY department ASC, salary DESC;ASCとDESCの組み合わせ
面接で頻出する落とし穴です。各列にはそれぞれ固有の方向が設定されます。ORDER BY a, b DESCと記述すると、aは昇順、bは降順にソートされ、両方が降順になるわけではありません。
両方を降順にしたい場合は、ORDER BY a DESC, b DESCと記述する必要があります。方向が混在する質問では、明示的に指定しましょう。
SELECT region, sales_year, revenue
FROM sales
ORDER BY region ASC, sales_year DESC;NULLはどこに配置されるか
ここがこのレッスンの核心です。NULLは未知を意味するため、標準規格では位置を強制しておらず、データベースによって異なります。
- PostgreSQLとOracle: NULLは
ASCでは最後、DESCでは最初にソートされます。 - MySQLとSQL Server: NULLは
ASCでは最初、DESCでは最後にソートされます(最小の値として扱われます)。
面接官は「このソートではNULLはどこに現れますか?」とよく質問します。正直な答えは、明示的に制御しない限り、使用するエンジンによるということです。
NULLの配置を明示的に制御する
エンジンのデフォルトに関係なく配置を決定的にするには、NULLS FIRSTまたはNULLS LASTを使用します。PostgreSQL、Oracle、SQLiteはこれを直接サポートしています。
次のクエリでは、列を昇順にソートしながら、未知の入社日を末尾に配置します。
SELECT name, hire_date
FROM employees
ORDER BY hire_date ASC NULLS LAST;MySQLでNULLS LASTを再現する
MySQLはNULLS LASTキーワードをサポートしていません。移植性のある回避策は、値がNULLかどうかを示すソートキーを先頭に置くことです。
hire_date IS NULLという式は、実際の日付に対して0、NULLに対して1を返します。これを昇順でソートするとNULLが末尾に移動し、続く2番目のキーで実際の日付がソートされます。
SELECT name, hire_date
FROM employees
ORDER BY (hire_date IS NULL) ASC, hire_date ASC;SQL ServerでNULLS FIRSTを再現する
SQL ServerもNULLS FIRST/LASTをサポートしていません。先頭のソートキーとしてCASE式を使用します。ここではNULLにランク0を割り当てるため、最初に表示されます。
このパターンは覚えておく価値があります。実際にソートしたい列の前に計算フラグ列を置くことで、どの方言でもNULLの位置を完全に制御できます。
SELECT name, hire_date
FROM employees
ORDER BY CASE WHEN hire_date IS NULL THEN 0 ELSE 1 END,
hire_date ASC;実例: リーダーボード
リーダーボードを作るとします。スコアの高い順に並べ、スコアが同じ場合は、登録日が早いプレイヤーを上位にします。一度もスコアを記録していないプレイヤー(NULLのスコア)は末尾に配置します。
ソートには3つのキーが必要です。NULLフラグ、降順のスコア、そしてタイブレーカーとして昇順の登録日です。
SELECT player, score, signup_date
FROM players
ORDER BY (score IS NULL) ASC,
score DESC,
signup_date ASC;ソートの安定性に関する注意点
もう1つの定番質問は、「すべてのORDER BYキーが同じ2行は、どのような順序で返されますか?」です。
答えは未定義です。SQLのソートは安定しているとは限らないため、同じ値の行の相対的な順序は任意であり、実行ごとに、またはインデックスの変更後に変わる可能性があります。
完全に一意なタイブレーカー(通常は主キー)を追加すれば、結果を再現可能にできます。
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC;ソートに関するパフォーマンス上の注意
ソートにはコストがかかる場合があります。ORDER BYが既存のインデックスと同じ列順および方向で一致していれば、エンジンはあらかじめソートされた行を読み取り、別途ソートする処理を省略できます。
方向が一致しない場合(たとえばインデックスがすべて昇順なのに、1列を降順でソートする場合)は、通常この最適化を利用できず、メモリ上またはディスク上でのソートが必要になります。インデックスの順序とソートコストの関係に言及すると、面接官に成熟した理解を示せます。
理解度チェック
複数列における方向指定のルールを理解しているか確認しましょう。
まとめ
複数列のソートとNULLの配置に関する重要なポイント:
ORDER BYを追加しない限り、結果セットに順序はありません。- 方向は列ごとに指定し、デフォルトは
ASCです。 - NULLの位置はエンジンによって異なります。Postgres/OracleではASCの最後、MySQL/SQL ServerではASCの最初です。
- サポートされている場合は
NULLS FIRST/LASTを使用し、それ以外では先頭にIS NULLまたはCASEのフラグを置きます。 - 再現可能な順序にするには、一意なタイブレーカー(主キーなど)を追加します。
よくある質問
「複数列の並べ替えとNULLの配置」レッスンは無料ですか?
はい。「複数列の並べ替えとNULLの配置」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「複数列の並べ替えとNULLの配置」で何を学びますか?
ASCとDESCの組み合わせ方、またデータベースごとのNULLS FIRST/LASTの違いを学びます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「複数列の並べ替えとNULLの配置」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 複数列の並べ替えとNULLの配置
- LIMIT、OFFSET、FETCH FIRST
- 上位N行を確実に返す
- 式とエイリアスで並べ替える