論理的なクエリ実行順序
なぜFROMがSELECTより先に実行されるのか、また実際の実行順序を知ることで、ひっかけ問題に答えられる理由を学びます。
「論理的なクエリ実行順序」はCoddyKit上の無料SQL Interview Prepレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Interview Prepコースには全4レッスンが含まれています。
多くの疑問を解くきっかけになる質問
面接官が「クエリは実際にはどの順番で実行されますか?」と尋ねるのは、この答えが多くのことを説明してくれるからです。たとえば、SELECTのエイリアスがWHEREで使えない理由や、WHEREで集約結果を絞り込めない理由などです。
記述順序と論理的な実行順序
クエリはSELECTから記述しますが、エンジンはFROMから実行します。SELECTがほぼ最後に評価されるこの違いが、混乱の大きな原因になります。
完全な論理的実行順序
完全な論理的実行順序は、FROM、WHERE、GROUP BY、HAVING、SELECT、DISTINCT、ORDER BY、最後にLIMITです。以下のさまざまな落とし穴は、すべてこの順序から自然に説明できます。
FROMが最初に実行される理由
FROMが最初に実行されるのは、エンジンが他の処理を行う前に処理対象の行を必要とするからです。まずデータの元となる行を作り、その後でWHEREが残す行を選びます。
SELECT e.name, d.name AS dept
FROM employees e
JOIN departments d ON d.id = e.department_id
WHERE e.salary > 50000;落とし穴:WHEREではエイリアスを使えない
最もよく聞かれるポイントは、SELECTのエイリアスをWHEREでは使えないことです。WHEREはSELECTより前に実行されるためです。以下のコードでは、エラーと、式を繰り返す修正方法を示します。
-- FAILS: alias 'annual' unknown in WHERE
SELECT salary * 12 AS annual
FROM employees
WHERE annual > 600000;
-- FIX: repeat the expression
SELECT salary * 12 AS annual
FROM employees
WHERE salary * 12 > 600000;落とし穴:WHEREから集約結果は見えない
WHEREはグループ化より前に実行されるため、COUNT()のような集約結果を参照できません。そのためにHAVINGがあります。WHEREは行を絞り込み、HAVINGは集約後のグループを絞り込みます。
-- WHERE cannot use COUNT(*)
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;ORDER BYでエイリアスを使える理由
その反対がORDER BYです。SELECTの後に実行されるため、SELECTのエイリアスを使えます。同じエイリアスでも実行されるタイミングが異なるため、WHEREでは使えず、ここでは使えるのです。
SELECT name, salary * 12 AS annual
FROM employees
ORDER BY annual DESC;DISTINCTが入る位置
DISTINCTはSELECTの後、ORDER BYの前に実行されます。出力列を基準に重複を取り除くため、並べ替えに使えるのはSELECTリストに残った列だけです。
-- ERROR in many engines:
-- ORDER BY column not in the DISTINCT select list
SELECT DISTINCT department
FROM employees
ORDER BY hire_date;クエリ全体を追ってみる
実際のクエリを各ステップに沿って追ってみましょう。FROMが行を読み込み、WHEREが絞り込み、GROUP BYがグループ分けし、HAVINGがグループを残し、SELECTが値を計算し、ORDER BYが並べ替え、LIMITが一部を切り出します。
SELECT customer_id, SUM(amount) AS total
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(amount) > 1000
ORDER BY total DESC
LIMIT 10;論理的実行と物理的実行
一歩進んだ回答として、次の点にも触れると印象的です。ここで説明したのは、正しさを定義する論理的な順序です。最終的に同じ行を返す限り、オプティマイザーの物理実行計画は異なっていても構いません。
順序を覚えるためのイメージ
順序を覚えるには、行がパイプラインを下へ流れ、各ステップが次のステップにより小さな集合を渡す様子を思い浮かべるとよいでしょう。何かが失敗したら、前のステップが必要なものを生成しているか確認します。
理解度チェック
実行順序を使って、エラーを見つけてみましょう。
まとめ
まとめ:論理的な実行順序はFROM、WHERE、GROUP BY、HAVING、SELECT、DISTINCT、ORDER BY、LIMITです。WHEREはSELECTより前に実行されるためエイリアスを使えず、ORDER BYは後に実行されるためエイリアスを使えます。
よくある質問
「論理的なクエリ実行順序」レッスンは無料ですか?
はい。「論理的なクエリ実行順序」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Interview Prepコースには全4レッスンが含まれています。
「論理的なクエリ実行順序」で何を学びますか?
なぜFROMがSELECTより先に実行されるのか、また実際の実行順序を知ることで、ひっかけ問題に答えられる理由を学びます。 ブラウザで直接実行するハンズオンコードでSQL Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「論理的なクエリ実行順序」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのSQL Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。