【手を動かす道場】SQL実戦10本ノック(抽出・集計・結合の「芯」をブラウザ内DBで完全制覇)

2026-11-06 / シリーズ「実戦コード・ノック道場」第1話 / SQL, データベース, ハンズオン, 10本ノック, 初心者向け

「SQLの本を1冊読んだのに、いざ実務のデータベースを前にすると、最初の1行すら手が動かない」 「100本ノックのサイトを開いたが、環境構築でつまずき、問題が多すぎて3日で挫折した」

そんな経験はありませんか? 断言します。実務の現場(データ抽出、売上集計、システム調査)で日常的に使われるSQLの90%以上は、マニアックな関数ではなく**「たった10個の基本パターン(型)の組み合わせ」**で書かれています。

しかも、SQLが書けない最大の原因は「英単語を忘れたから」ではありません。 「人間がSQLを書く順番」と「データベースが裏側でデータを処理する物理的な順番」がまったく逆であるという事実を知らないまま、丸暗記しようとしているからです。

この記事では、環境構築は一切不要です。 まずは5分で「SQLが裏で動く物理順序」を腹落ちさせ、そのままページ内の**「埋め込みSQL道場」で実際にコードを打ち込み、自分の手で10本ノックをクリア**してください。


1. なぜSQLは混乱するのか?「書く順番」と「動く順番」のねじれ

私たちがSQLを書くとき、必ず SELECT(どの列を表示するか)から書き始めます。英語の語順(“Select A from B where C…”)に似せるため、1970年代にIBMの研究者たちがそう設計したからです。

しかし、データベースエンジン(MySQLやPostgreSQL、SQLiteなど)がメモリとディスクの上で実際にデータを処理する順番は、『FROM(どの表を広げるか)』が絶対の最初であり、『SELECT(どの列を切り出すか)』はほぼ最後です。

✍️ 人間が書く順番(英語の語順) ⚙️ DBが処理する物理順序 1. SELECT:表示する列 2. FROM:対象の表 3. JOIN:表の結合 4. WHERE:行の絞り込み 5. GROUP BY:グループ化 6. HAVING:集計後の絞り込み 7. ORDER BY / LIMIT:並び替え 1. FROM / JOIN まずテーブルをメモリに広げ結合する 2. WHERE 不要な行を削ぎ落とす 3. GROUP BY 同じ値の行を束ねる 4. HAVING 束ねた結果から条件外の束を捨てる 5. SELECT ここで初めて必要な列だけを切り出す! 6. ORDER BY / LIMIT 最後に綺麗に並べて件数を絞る 書く順番と動く順番はほぼ真逆 ― だから WHERE で別名や集計が使えない

この「物理順序」を知ると、長年の謎が一瞬で解ける

  1. なぜ WHERE の中で SUM() や COUNT() が使えないのか? WHERE が実行されるのは第2段階、データを束ねる GROUP BY(第3段階)の前だからです。まだ束ねてすらいない段階で「束の合計が100以上」という条件は物理的に判定できません。だから束ねた後に判定する HAVING(第4段階)が存在するのです。
  2. なぜ SELECT でつけた別名(AS total など)が WHERE で使えず、ORDER BY では使えるのか? SELECT が実行されるのは第5段階だからです。第2段階の WHERE の時点では、まだその別名はこの世に誕生していません。一方、第6段階の ORDER BY の時点ではすでに SELECT が終わっているため、別名が使えるのです。

これから挑む10本ノックでは、常に頭の中で**「①まず FROM で表を思い浮かべ、② WHERE で行を削り、③最後に SELECT で列を抜く」**という物理イメージを持ってキーボードを叩いてください。

🛒 ミニSQL実行体験:商品テーブルを絞って、並べる

下の商品テーブル(products)に対して、WHERE(行の絞り込み)と ORDER BY(並び替え)の部品ボタンを選んでください。選ぶたびにSQL文が組み上がり、結果表がその場で変わります。第1節の「物理順序」どおり、まず WHERE で行が削られ、最後に ORDER BY で並び替えられる流れを目で追ってみてください(下の本格道場のウォーミングアップです)。

WHERE(行の絞り込み)

ORDER BY(並び替え)


2. 【実践】ブラウザ内完結・SQL実戦10本ノック道場

下のボックスは、あなたのブラウザの中で実際に動いているデータベース環境です。 とあるIT企業「アストロ商事」の社員テーブル(employees)、部署テーブル(departments)、**売上テーブル(sales)**の3つが格納されています。

問題を読み、エディタにSQLを入力して**「▶ SQLを実行&採点」**ボタンを押してください(自由にクエリを書き換えて実験しても壊れません)。

INTERACTIVE SQL DOJO 全10問・実戦クエリ演習
クリア状況: 0 / 10 問
📊 データベースのテーブル構造(クリックで開閉)
1. employees(社員表 / 6行)
・id (社員ID)
・name (氏名)
・dept_id (部署ID)
・salary (月給・万円)
・join_year (入社年)
2. departments(部署表 / 3行)
・id (部署ID: 10, 20, 30)
・dept_name (部署名: 営業部, 開発部, 総務部)
3. sales(売上表 / 6行)
・id (売上ID)
・emp_id (担当社員ID)
・amount (売上金額・万円)
・sale_month (売上月)
▼ クエリ実行結果
まだ実行されていません。上のボタンを押してください。

3. 全10本ノックの「急所」と模範解答・完全解説

道場で手を動かした後に読むことで、記憶が10倍定着する「全10問の物理メカニズム解説」です。スマホで読んでいる方も、ここを読むだけで現場のSQLの急所がすべて頭に入ります。

第1問〜第4問:データを削り出し、整列させる基本の型

【Q1】特定の列だけを取り出す(プロジェクション:射影)

SELECT name, salary FROM employees;

【Q2】条件で行を絞り込む(セレクション:選択)

SELECT * FROM employees WHERE salary >= 45;

【Q3】複数条件の組み合わせ(論理演算 AND / OR)

SELECT name, join_year FROM employees
WHERE dept_id = 10 AND join_year >= 2020;

【Q4】並び替えと件数制限(ORDER BY + LIMIT)

SELECT name, salary FROM employees
ORDER BY salary DESC
LIMIT 3;

第5問〜第7問:データを束ねて集計する型(GROUP BY と HAVING)

【Q5】テーブル全体の集計関数

SELECT COUNT(*), AVG(salary) FROM employees;

【Q6】グループごとの集計(GROUP BY)

SELECT dept_id, COUNT(*) FROM employees
GROUP BY dept_id;

【Q7】集計した結果に対する絞り込み(HAVING)

SELECT emp_id, SUM(amount) FROM sales
GROUP BY emp_id
HAVING SUM(amount) >= 200;

第8問〜第10問:複数の表を繋ぎ、高度な抽出を行う型(JOIN とサブクエリ)

【Q8】内部結合(INNER JOIN)

SELECT e.name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.id;

【Q9】外部結合と COUNT の罠(LEFT JOIN)

SELECT e.name, COUNT(s.id)
FROM employees e
LEFT JOIN sales s ON e.id = s.emp_id
GROUP BY e.id, e.name;
INNER JOIN(内部結合) 両方の表に存在する行だけが残る 佐藤(売上あり)→ そのまま残る ✅ 田中(売上なし)→ 行ごと消滅 ❌ 伊藤(売上なし)→ 行ごと消滅 ❌ 「0件の人」が一覧から消えてしまう! LEFT JOIN(外部結合) 左の表(employees)は全員残す 佐藤(売上あり)→ そのまま残る ✅ 田中(売上なし)→ NULLとして残る ✅ 伊藤(売上なし)→ NULLとして残る ✅ 0件も数えるには COUNT(s.id) が鉄則

【Q10】サブクエリ(クエリの中のクエリ)

SELECT name, salary FROM employees
WHERE salary > (
  SELECT AVG(salary) FROM employees
);

結論:SQLとは「集合を削り出す彫刻」である

プログラミング言語(PythonやJavaなど)が「1行ずつループを回して手順を指示する(手続き型)」のに対し、SQLは**「どんなデータの集合が欲しいかという『完成形』を宣言する(宣言型)」**言語です。

  1. FROM と JOIN で、必要な粘土の塊(テーブル)を作業台に広げる。
  2. WHERE で、いらない部分を大まかに削ぎ落とす。
  3. GROUP BY と HAVING で、形を束ねて整える。
  4. SELECT と ORDER BY で、最後に必要な断面だけを切り出して磨く。

この彫刻の順番さえ指先に馴染めば、どんなに巨大で複雑なデータベースを前にしても、迷うことは二度とありません。


📝 3行で頭に入る『試験・実務・投資の要点まとめ』

  1. 【実行順序の物理】 SQLは SELECT から書くが、DB内部の物理処理は FROM/JOIN ➔ WHERE ➔ GROUP BY ➔ HAVING ➔ SELECT ➔ ORDER BY の順で実行される。
  2. 【WHEREとHAVINGの境界】 グループ化する前の「個別の行」を絞るのが WHERE、グループ化した後の「集計結果(合計や件数)」を絞るのが HAVING である。
  3. 【LEFT JOINとCOUNTの急所】 「実績0件の人」も一覧に出すには LEFT JOIN が必須であり、その際は COUNT(*) ではなく結合先の列名 COUNT(s.id) を指定しないと0件が1件と誤判定される。

確認クイズ

📝 確認クイズ(3問)