GUIDE

本問題集の使い方

1セットは5問。前提知識 → 問題 → 期待出力 の順に読み、自分で解いてから模範解答と解説を開きます。頭の中で組み立てるだけでも、実際に書いてみても構いません。解説では、クエリの各段階でテーブルがどう変わるかをステップ送りで追えます。

01学習の流れ

  1. STEP 01テーマを選ぶ順序に迷うときは TOP の学習コースに沿って進めます。
  2. STEP 025問を解く設問ごとに前提知識と使用テーブルが付くので、解くための材料はページ内で揃います。
  3. STEP 03解説で確かめる模範解答のコメントと、テーブル変化の可視化で、なぜその結果になるかを確認します。
  4. STEP 04記録が貯まる「解けた」「復習する」を押すと、TOPの一覧・コース・テーマ別の進捗に反映されます。

02一覧の読み方

TOPはテーマごとの見出しと、セットの行で構成されます。行は左から「巻-分冊 / タイトル / レベル / 進捗」です。

01 テーマ見出し テーマ名・セット数と、そのテーマの進み具合。

JOIN8 セット・各5問

02 レベルと進捗 行の右端は「解けた」を押した設問数。5問すべてで青く点灯します。その左は基礎/応用の別。
03 巻-分冊 1-1は第1巻の前半5問、1-2が後半。基礎→応用の順に並びます。

03問題画面の読み方

以下は実際の問題画面です。アコーディオンの開閉とステップ送りは、この場で操作できます。

例: JOIN 基礎 1-1

01 セット内の5問 上段は現在地と完了数。タブで5問を行き来し、解けた問題には✓、復習マークにはしおり記号が付きます。下の細いバーがセットの進み具合です。
1 / 5 · 学習中0 / 5 問完了
QUESTION 1

INNER JOIN — 共通キーで2テーブルを結合し、両方に存在する行だけを取得する

INNER JOINON句基礎積集合
02 設問の見出し 「何を学ぶか」を1行で示すタイトルと、キーワードのタグ。
03 前提知識 解くのに必要な文法・構文をここで確認します。構文の型と注意点は必ず設問の直前に置いています。
前提知識

JOIN とは、共通のキー列(例: user_id)をもとに2つのテーブルを横方向に結合する操作です。正規化されたDBでは「ユーザー情報は users テーブル」「注文情報は orders テーブル」と分割して保存するため、関連データを一緒に取得するには JOIN が必要です。

INNER JOIN は最もシンプルなJOINで、ON句で指定したキーが両テーブルに存在する行のみを結果に含めます。片方のテーブルにしかないキーの行は除外されます(積集合)。

SELECT 列名, ...
FROM   左テーブル AS エイリアス
INNER JOIN 右テーブル AS エイリアス
  ON 左テーブル.キー列 = 右テーブル.キー列;
テーブルエイリアス(AS o / AS u): AS o のように短縮名を付けると o.user_id と書け、「ordersテーブルの user_id」と明示できます。特に同名の列が複数テーブルにある場合はエイリアス修飾が必須です。
問題

orders(注文)テーブルと users(ユーザー)テーブルを user_id で結合し、order_id・ユーザー名(name)・amount(注文金額)を取得してください。

ordersuser_id = 4users テーブルに存在しません。また usersuser_id = 3(山田)は注文がありません。

使用テーブル
▸ orders
order_iduser_idamount
113000
225000
341200
▸ users
user_idname
1田中
2佐藤
3山田
04 問題と使用テーブル 入力データは実際の表で示します。この表と期待出力の差分が、求めるSQLです。
05 期待出力 目指す結果。自分の答えと1行ずつ突き合わせます。
期待出力
order_idnameamount
1田中3000
2佐藤5000
模範解答コード
SELECT
  o.order_id,
  u.name,      -- u. プレフィックスで「usersテーブルのname」と明示する
  o.amount

FROM orders AS o         -- orders を起点(左テーブル)にする
INNER JOIN users AS u   -- users と結合(右テーブル)
  ON o.user_id = u.user_id  -- 照合キー: 両テーブルの user_id が一致する行のみ結合
ORDER BY o.order_id;

/*
  実行順序:
  1. FROM orders AS o        → orders テーブル
  2. INNER JOIN users AS u   → orders の各行に対し ON 条件を満たす users の行を照合・結合
  3. SELECT o.order_id, ...  → 結合された仮想テーブル
  */
06 模範解答コード 自分で解いてから開きます。各句の意図と実行順序をコメントで補います。
07 テーブル変化の可視化 ステップを送ると、どの行・列が評価され、何が残り何が落ちるかが色で分かります。← → キーでも送れます。
解説(テーブル変化・ポイント)
SELECT o.order_id, u.name, o.amount FROM orders AS o INNER JOIN users AS u ON o.user_id = u.user_id;
LEGEND
データ取得・読込対象
① FROM
FROM orders AS oorders テーブル(3行)を読み込みます。user_id 列が JOIN のキーになります。この後、各行に対して users テーブルとの照合が行われます。
1 / 3
order_iduser_idamount
113000
225000
341200
全 3行 読込

実際のページでは、この下に図解つきのポイント解説が続きます。

08 解けた・復習する 押すと記録され、タブの✓・しおり記号・セットのバー・TOPの進捗が同時に動きます。

この図はスクリーンショットではなく、問題ページと同じHTML・同じCSSで組み立てています。ここでの操作は学習記録として保存されません。

04記録と復習

アカウントと学習記録の管理 →
はじめる最初は「SQL基礎」コースの1セット目から。
最初のセットを開く → テーマ一覧を見る