SELECT文の実行順序
SELECT文の実行順序 とは
SQLのSELECT文がどのように実行されるのか、その順序について解説します。本レッスンでは、SELECT文の実行順序 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
SQL の SELECT 文は、書いた順序通りには実行されません。SELECT 列名 FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT ... の順で 書く けれど、評価される (実行される) のはまったく違う順番です。この実行順序を理解していないと「WHERE で SELECT のエイリアスが使えない」「HAVING が WHERE より遅い」「ORDER BY でエイリアスが使える理由」のような落とし穴に毎回はまってしまいます。
逆に実行順序さえ覚えてしまえば、複雑なクエリも「どの句がどのタイミングで動いているのか」を頭の中で追えるので、デバッグも速くなります。データ集計の総まとめとして、ここで実行順序をしっかり整理します。
標準の実行順序
もっとも一般的な SELECT 文の論理的な実行順序は次のとおりです。
書く順序と実行順序がずれている点が SQL の特異な特徴です。実際には DB の 最適化エンジン が内部で順序を入れ替えますが、論理的な意味としてはこの順序が正解と覚えておけば十分です。
各句の役割を一文で
各句の役割を順番に並べると次のとおりです。
FROMテーブルを読み込むWHERE集計前の行を絞るGROUP BY行をグループに束ねる- 集計関数 グループを 1 行に圧縮する
HAVING集計後のグループを絞るSELECT出力列を選び、エイリアスを付けるDISTINCT結果の重複を排除するORDER BY並べ替えるLIMIT/OFFSET上から N 件取り出す
代表例 1 各句を全部使ったクエリ
すべての句を組み合わせた例です。
SQL クエリ
SELECT
category,
SUM(price) AS total_price
FROM products
WHERE price >= 1000
GROUP BY category
HAVING SUM(price) >= 5000
ORDER BY total_price DESC
LIMIT 3;この 1 つのクエリで、次の流れが行われます。
productsテーブルから全行を読むprice >= 1000の行だけ残すcategoryでグループ化SUM(price)を計算- 合計が 5000 円以上のグループだけ残す
categoryとtotal_priceを出力total_priceの降順で並べる- 上から 3 件を返す
代表例 2 ORDER BY でエイリアスが使える理由
SELECT 句で定義した AS total_price を、ORDER BY ではそのまま参照できます。これは ORDER BY の評価が SELECT より後だからです。
SQL クエリ
SELECT name, price * stock AS inventory_value
FROM products
ORDER BY inventory_value DESC;一方で、WHERE 句では SELECT より前に評価されるため、SELECT で定義した エイリアス は使えません。
SQL クエリ
-- これは多くの DB でエラー
SELECT price * 1.10 AS price_with_tax
FROM products
WHERE price_with_tax > 5000;
-- 代わりに式を書き直す
SELECT price * 1.10 AS price_with_tax
FROM products
WHERE price * 1.10 > 5000;ORDER BY ではエイリアスが使える、WHERE では使えない。この差は実行順序が SELECT より前か後かで決まります。
エラーになるパターンの例
初心者がよく出会う エラーパターン を実行順序の観点で見てみます。
SQL クエリ
-- 1) WHERE に集計関数を書いてエラー
SELECT category, SUM(price) AS total
FROM products
WHERE SUM(price) >= 10000 -- 集計関数は WHERE では使えない (HAVING に書くべき)
GROUP BY category;
-- 2) GROUP BY していない列を SELECT に書いてエラー
SELECT category, name, COUNT(*) FROM products GROUP BY category;
-- name は GROUP BY に含まれないので、どの name を出すか不確定どちらも実行順序の知識があれば「なぜダメか」がすぐ説明できます。
書く順序と実行順序の違いを覚えてしまえば、SQL の落とし穴の多くは自然に避けられます。エラーメッセージを見たらまず「実行順序のどこで止まったのか」と考える癖を付けましょう。
まとめ
- 書く順序と実行順序は別物
- 実行順序は FROM → WHERE → GROUP BY → 集計 → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT
- ORDER BY では SELECT のエイリアスが使えるが、WHERE では使えない
- WHERE に集計関数を書くとエラー。HAVING に書く
- GROUP BY していない列を SELECT に書くとエラー (集計関数なら OK)
次のレッスン
次は 集計分析チャレンジ です。SQLの集計関数を使ったデータ分析に挑戦!学んだ知識を活かして問題を解きましょう。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- SELECT 実行順序 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. SELECT 実行順序 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
テーブル構造
schema.sql
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
category VARCHAR(30) NOT NULL,
price INT NOT NULL
);
INSERT INTO products (id, name, category, price) VALUES
(1, 'ノートPC', '家電', 128000),
(2, 'マウス', '家電', 2980),
(3, 'キーボード', '家電', 6800),
(4, '小説A', '書籍', 1800),
(5, '小説B', '書籍', 2200),
(6, '専門書A', '書籍', 4500),
(7, 'コーヒー豆', '食品', 1500),
(8, '紅茶葉', '食品', 1200);期待される出力
| category | total |
|---|---|
| 家電 | 137780 |
| 書籍 | 8500 |