SQLの実行順序を完全理解!「書く順番」と「動く順番」が違う理由を現役エンジニアが徹底解説
1. はじめに:SQLが「魔法の呪文」に見えるあなたへ
プログラミングを学び始めたばかりの頃、SQLはとても不思議な言語に見えます。「これを取ってきて」とお願いするだけでデータが出てくる。しかし、少し複雑なことをしようとすると、途端に牙を剥きます。
- 「SELECTでつけた名前にWHEREでエラーが出る...」
- 「GROUP BYとHAVINGの違いがよくわからない...」
これらの悩みの原因は、実はすべて 「SQLの実行順序」 に集約されます。
SQLは「宣言型」と呼ばれる言語です。「どう処理するか(手続き)」ではなく「何が欲しいか(宣言)」を書くため、私たちがエディタに打ち込む順番と、データベース内部で処理される順番があえてズレるように設計されているのです。
この記事では、その「ズレ」の正体を解き明かし、基本情報技術者試験でも実務でも役立つ「SQLの真の動き」を解説します。
2. 結論:SQLには「書く順」と「動く順」の2つがある
まず、結論からお伝えします。
SQLには、私たちがコードを書く際の 「記述順」 と、データベースエンジンが解釈する 「実行順」 の2つのルールが存在します。
以下の表を見てください。この違いこそが、SQL最大の落とし穴です。
【比較表】記述順 vs 実行順
| 順番 | 記述する順番(書く順) | データベースが動く順番(実行順) |
|---|---|---|
| 1 | SELECT |
FROM (+ JOIN) |
| 2 | FROM |
WHERE |
| 3 | WHERE |
GROUP BY |
| 4 | GROUP BY |
HAVING |
| 5 | HAVING |
SELECT |
| 6 | ORDER BY |
DISTINCT |
| 7 |
LIMIT / OFFSET
|
ORDER BY |
| 8 | - | LIMIT / OFFSET |
一言で言えば、「SELECT(列を選ぶ作業)は、実はかなり後半に行われる」 ということです。これが分かると、エラーの理由が論理的に理解できるようになります。
3. 【本題】SQLクエリが実行される「8つのステップ」を解剖する
なぜこの順番なのか? データベースエンジンの気持ちになって、1ステップずつ見ていきましょう。
Step 1 & 2: FROM & JOIN(データの場所を特定する)
まず最初に「どのテーブルの話をしているか」を決めないと何も始まりません。
本棚から本を取り出す作業です。複数のテーブルをくっつける(JOIN)作業もここで行われます。
Step 3: WHERE(不要な行を削る)
次に、条件に合わないデータを捨てます。
早い段階でデータを絞り込むことで、その後の「集計」や「並べ替え」といった重い処理を軽くするためです。
Step 4: GROUP BY(箱に分ける)
残ったデータを、指定された列ごとにグループ分けします。
例えば、「部署ごとに集計したい」なら、ここで部署別の箱(グループ)が作られます。
Step 5: HAVING(グループに対して絞り込む)
グループ化した結果に対して、さらに条件をかけます。
「合計金額が100万円以上の部署だけ残す」といった処理です。WHEREが「個々の行」に対するフィルターなのに対し、HAVINGは「グループの塊」に対するフィルターです。
Step 6: SELECT(列を抜き出し、加工する)
ここでようやく、どの列を表示するかが決まります。
列に別名(エイリアス)をつけたり、計算(price * 1.1 など)を行ったりするのもここです。
Step 7: DISTINCT(重複を消す)
SELECTで選ばれた結果の中に、全く同じ行があれば1つにまとめます。
Step 8 & 9: ORDER BY & LIMIT(最後に見た目を整える)
すべてのデータが確定した後、最後に並べ替え(昇順・降順)を行い、必要な件数だけ(LIMIT)をユーザーに返します。
4. 身近な例えで理解する:レストランの「サラダバー」
この複雑な流れを、レストランのサラダバーに例えてみましょう。
- FROM: 野菜が置いてある「サラダコーナー」へ行く。
- WHERE: 傷んでいる野菜や、嫌いな野菜をトレイに入れない(行の絞り込み)。
- GROUP BY: トレイの中で「レタス」「トマト」「豆」と場所を分ける(グループ化)。
- HAVING: 「豆が3粒以下の場所」は物足りないのでトレイから出す(グループの絞り込み)。
- SELECT: 最後にドレッシングをかけたり、お皿に綺麗に盛り付ける(列の加工・表示)。
- ORDER BY: 最後にテーブルへ運ぶ際、見栄えが良いように向きを整える(並べ替え)。
どうでしょう? 「お皿に盛る(SELECT)」よりも前に、「野菜を選ぶ(WHERE)」必要があるのは当然ですよね。
5. 重要:なぜSELECTでつけた「別名」がWHEREで使えないのか?
初学者が必ず遭遇するエラーがあります。
-- ❌ エラーになる例
SELECT
price * 1.1 AS tax_price -- ここで tax_price と名付けた
FROM
products
WHERE
tax_price > 1000; -- ここでは tax_price を知らないと言われる!
なぜエラーになるのでしょうか? 実行順序を思い出してください。
- WHERE句が先に実行される
- SELECT句はその後に実行される
データベースがWHERE句を処理している時点では、まだSELECT句を見ていません。つまり、tax_priceという名前(あだ名)は、まだこの世に誕生していないのです。
対照的に、ORDER BYではSELECTでつけた別名が使えます。なぜなら、ORDER BYはSELECTの後に実行されるからです。
6. 実践:実行順序を意識するとSQLがこう変わる
この知識は、単なる試験対策ではありません。実務での 「パフォーマンス改善」 に直結します。
WHEREで絞れるものはHAVINGで絞らない
HAVINGは「グループ化(GROUP BY)」した後に動きます。
グループ化はコンピュータにとって負荷が高い処理です。グループ化する前にWHEREでデータを減らしておけば、データベースの負担が減り、検索スピードが劇的に上がります。
インデックスの活用
実行順序のトップバッターであるFROMやWHEREに関連する列に「インデックス」を貼ることで、データベースは広大な本棚から一瞬で目的のページを見つけられるようになります。
7. まとめ:実行順序を制する者はSQLを制す
SQLの実行順序を理解することは、データベースとの「共通言語」を持つことです。
- FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
- この流れを意識するだけで、エラーの原因が手に取るようにわかります。
- 基本情報技術者試験でも、この順序を問う問題や、順序を理解していないと解けない計算問題が頻出します。
最初は紙に書いて壁に貼っておくのも良いでしょう。何度もクエリを書くうちに、自然とこの「データの流れ」が脳内に浮かぶようになります。そうなれば、あなたはもうSQL初学者卒業です!
8. 参考リンク集
さらに深く学びたい方は、以下の公式資料や信頼できるソースを参照してください。
-
IPA 独立行政法人 情報処理推進機構
- 基本情報技術者試験 科目B 重点対策(SQLの基礎概念は必須知識です)
-
PostgreSQL 公式ドキュメント
- SELECT文の解説(標準SQLに近い仕様が学べます)
-
MySQL 公式リファレンス
- SELECT ステートメント(実行順序に関する詳細な振る舞いを確認できます)