データベースの用語一覧へ
このページの目次

実行順序とは?

最終更新:2026/08/18

3秒でわかる

SQL は書いた順ではなく FROM から評価される。順番を知れば別名が使えない理由も WHERE と HAVING の違いも説明でき、遅い原因も追える。

もう少し詳しく

どういうものか

SQL の各句がデータベース内部で処理される順番のことです。人間は SELECT から書き始めますが、実際の評価は FROM で対象のテーブルを決めるところから始まります。標準的な SELECT 文では FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT の順に進みます。

つまり SELECT で付けた列の別名は、SELECT より前に動く WHERE や GROUP BY からは見えません。逆に SELECT の後に動く ORDER BY からは見えます。この一点だけでも、初学者が出す SQL エラーのかなりの部分を説明できます。

なぜ必要か

書いた順と動く順が違うことを知らないと、エラーメッセージが理不尽に見えます。「同じ別名なのに ORDER BY では通って WHERE では Unknown column になる」という現象は、順番を知っていれば当たり前の話ですが、知らなければ当てずっぽうで書き直すしかありません。

性能面でも効きます。LIMIT 10 と書いたから 10 行しか読んでいない、という思い込みはよくある誤解で、実際は ORDER BY が全行を並べ替えてから先頭 10 行を切り出します。どの段階で行数が減るのかを把握できると、インデックスを張る列の見当も付きます。

具体例

SELECT department, COUNT(*) AS member_count FROM employees WHERE hire_date >= '2020-01-01' GROUP BY department HAVING COUNT(*) >= 3 ORDER BY member_count DESC LIMIT 5;

このクエリは employees 全体から 2020 年以降の入社者だけを残し (WHERE)、部署ごとにまとめ (GROUP BY)、3 人以上のグループだけを残し (HAVING)、そこでようやく列を選び (SELECT)、人数の多い順に並べて (ORDER BY) 上位 5 件を返します。HAVING で member_count という別名が使えず COUNT(*) と書き直しているのは、HAVING が SELECT より先に動くためです。

つまずきやすいところ

  • WHERE の中で SELECT の別名を参照してエラーになる。別名は使わず元の式をそのまま書き直します

  • 集計した結果で絞り込みたいのに WHERE に書いてしまう。集計後の条件は HAVING です

  • WHERE で削れる行を HAVING で削る。どちらでも結果は同じでも、先に削ったほうが集計する行数が減って速くなります
  • 似た用語との違い

    動くタイミング絞り込む対象
    WHEREGROUP BY の前集計前の 1 行ずつ
    HAVINGGROUP BY の後集計してできたグループ


    覚え方

    「FROM で集めて、WHERE で捨てて、GROUP でまとめて、HAVING でまた捨てて、最後に SELECT で見せる」と口に出して覚えると、別名が見える範囲も自然に思い出せます。

    知識のつながり

    サイドバーと同じ推奨ルート・関連語を、まとめて確認できます。

    現在地実行順序DB

    LEARN BY DOING

    この用語を、教材で使ってみる

    直接関連する編と、その編を含むコースです。用語だけで終わらず、ブラウザ上で実際に手を動かせます。

    この用語を扱うコース

    コース

    SQL入門:データベース操作のきほん

    71レッスン
    コース

    SQL道場 図書館DBに挑む10問

    10レッスン
    コース

    DB設計入門 ER図・正規化・インデックス

    47レッスン
    SQL・データベースコースの全編を見る