📖 テーマ設定
🔊 音声設定
1.2
1.0
1.0
▶️ 再生コントロール
🎵 BGM設定
0.3
🔔 効果音設定
0.3

確認テスト

概要

  • 日程: Day 2 / セッション 12
  • 時間: 16:10-16:40
  • 形式: 演習
  • ゴール: 全範囲を網羅する15問の確認テストを解き、現在の到達度を自己採点で把握できる
  • 学習形式: 演習(個人作業)

導入(5分)

ここまで2日間、お疲れさまでした。最後に「自分の理解度の健康診断」として15問の確認テストに挑戦します。

これは点数を競うものではありません。間違えた問題こそが財産 です。「自分はどこが分かっていないか」が見えれば、研修後の学習が10倍効率化します。逆に「なんとなく合っていたけど理由は説明できない」という問題は、次のセッションで言葉にする訓練をしましょう。

進め方

  1. 解答例は問題の直後にあります。まず解答例を見ずに自分で考える ことが大事です
  2. 紙に書く・別ファイルにメモする・psqlに打ち込む、いずれもOK
  3. 1問につき1〜2分が目安。詰まったら一旦飛ばして先へ
  4. 全問終わってから自己採点。AIに「この回答を採点して」と頼んでも良い

ターミナルで psql に接続しておくと、SQL記述問題で実機確認できます。

docker exec -it postgres-sandbox psql -U postgres -d sandbox

演習(25分)


■ パート1: 概念説明(4問)


第1問

リレーショナルデータベースにおける「主キー(PRIMARY KEY)」の特徴を2つ挙げてください。

【解答例と解説】

  • 一意性:同じ値を持つ行は存在しない
  • 非NULL:必ず値が入っている(NULLは不可)

つまり「主キーは行を1つに特定できる身分証明書」。1テーブルに1つ。


第2問

次の文の空欄を埋めてください。

SELECT 文の WHERE 句は(A)を絞り込み、HAVING 句は(B)の結果を絞り込む。GROUP BY は WHERE の(C:前 or 後)に、HAVING は GROUP BY の(D:前 or 後)に評価される。

【解答例と解説】

  • A: 行(レコード)
  • B: 集計(GROUP BY)
  • C: 後
  • D: 後

実行順序の覚え方:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY


第3問

ACID特性の4つの頭文字とその意味を答えてください。

【解答例と解説】

  • A: Atomicity(原子性)—全部やるか、全部やらないか
  • C: Consistency(一貫性)—制約に違反した状態にならない
  • I: Isolation(独立性)—他のトランザクションから干渉されない
  • D: Durability(永続性)—COMMITしたデータは消えない

振込の例で全部説明できれば完璧。


第4問

INNER JOIN と LEFT JOIN の違いを「マッチしない行をどう扱うか」の観点で1〜2文で説明してください。

【解答例と解説】

  • INNER JOIN:両側のテーブルでマッチした行だけを返す
  • LEFT JOIN:左側のテーブルの行は全部返し、右側でマッチしない行は NULL で埋める

例:employees LEFT JOIN departments なら、部署未所属の社員も結果に出る。INNER JOIN なら出ない。


■ パート2: SQL記述(8問)


第5問

employees テーブルから、給与(salary)が50万以上の社員の姓・名・給与を、給与の降順で取得するSQLを書いてください。

【解答例と解説】

SELECT last_name, first_name, salary
FROM employees
WHERE salary >= 500000
ORDER BY salary DESC;

ポイント:>= で「以上」、ORDER BY ... DESC で降順。


第6問

products テーブルから、商品名(product_name)に「PC」を含む商品の一覧を取得するSQLを書いてください。

【解答例と解説】

SELECT product_name, price
FROM products
WHERE product_name LIKE '%PC%';

ポイント:LIKE のワイルドカード % は「0文字以上の任意文字列」。


第7問

employeesdepartments を結合し、各社員の姓名と所属部署名を表示するSQLを書いてください。部署未所属の社員も含めること。

【解答例と解説】

SELECT e.last_name, e.first_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
ORDER BY e.employee_id;

ポイント:「未所属も含める」と言われたら LEFT JOIN。INNER だと未所属が消える。


第8問

orders テーブルから、顧客ID(customer_id)ごとの注文件数を取得するSQLを書いてください。注文件数が2件以上の顧客のみ表示すること。

【解答例と解説】

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) >= 2
ORDER BY order_count DESC;

ポイント:集計結果での絞り込みは HAVING。WHERE では書けない。


第9問

customers テーブルに、新しい顧客「テスト商事」(email: test@test.co.jp、電話: 03-0000-0000)を1件追加するINSERT文を書いてください。

【解答例と解説】

INSERT INTO customers (customer_name, email, phone)
VALUES ('テスト商事', 'test@test.co.jp', '03-0000-0000');

ポイント:customer_id は SERIAL なので省略。addresscreated_at も省略OK。


第10問

employees テーブルから、給与の全社平均より高い社員の姓・名・給与を取得するSQL(サブクエリを使う)を書いてください。

【解答例と解説】

SELECT last_name, first_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
ORDER BY salary DESC;

ポイント:スカラーサブクエリ(カッコの中で値1つを返す)の典型例。


第11問

「書籍カテゴリ」(categories の category_name = '書籍')に属する商品の一覧(商品名・価格)を、JOINで取得するSQLを書いてください。

【解答例と解説】

SELECT p.product_name, p.price
FROM products p
JOIN categories c ON p.category_id = c.category_id
WHERE c.category_name = '書籍'
ORDER BY p.price DESC;

ポイント:JOINしてからWHEREで絞る。EXISTSやINでも書けるが、JOINが最も読みやすい。


第12問

「研修コース」を表すテーブル courses を、次の要件で CREATE TABLE してください。

  • course_id:主キー、自動採番
  • course_name:必須、最大100文字
  • duration_hours:必須、整数、0より大きい

【解答例と解説】

CREATE TABLE courses (
    course_id SERIAL PRIMARY KEY,
    course_name VARCHAR(100) NOT NULL,
    duration_hours INTEGER NOT NULL CHECK (duration_hours > 0)
);

ポイント:SERIAL は自動採番、CHECK は条件式で値を検査。


■ パート3: エラー発見・修正(3問)


第13問

次のSQLには問題があります。何が間違っていて、どう直すべきか答えてください。

SELECT department_id, COUNT(*)
FROM employees
WHERE COUNT(*) >= 2;

【解答例と解説】

  • 間違い1: WHERE 句で集計関数(COUNT)を使えない
  • 間違い2: GROUP BY がない

修正:

SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id
HAVING COUNT(*) >= 2;

集計結果に対する条件は HAVING で書く。


第14問

次のSQLには非常に危険な問題があります。何が問題で、本番で実行したら何が起こるか説明してください。

UPDATE employees SET salary = 500000;

【解答例と解説】

  • 問題: WHERE 句が無い
  • 結果: 全社員の給与が一律50万円に書き換わる

修正例: 特定の社員だけを対象にするWHEREを付ける。

UPDATE employees SET salary = 500000 WHERE employee_id = 3;

予防策: 実行前に BEGIN; を打って、結果を確認してから COMMIT;、おかしければ ROLLBACK;


第15問

次のSQLを実行すると、PostgreSQLでエラーになります。原因と修正方法を答えてください。

SELECT department_id, first_name, AVG(salary)
FROM employees
GROUP BY department_id;

【解答例と解説】

  • 原因: first_name が集計関数でも GROUP BY 句にも含まれていない
  • エラーメッセージ例: column "employees.first_name" must appear in the GROUP BY clause or be used in an aggregate function

修正例:first_name を表示する意味があれば GROUP BY に追加、不要なら列ごと削除。

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;

ポイント:GROUP BY すると「グループ単位の行」になるので、グループ内で値が複数あり得る列はそのまま表示できない。


まとめ(5分)

おつかれさまでした。何問正解できたかをメモしておきましょう。

  • 12〜15問: しっかり身についています。実務でも応用可能なレベル
  • 8〜11問: 基礎は固まっています。ところどころ復習しましょう
  • 7問以下: 焦らず、次のセッションで間違えた項目をじっくり振り返ります

点数より、間違えた問題が何を問うていたかを言葉にできることが大事です。次のセッションでは、不正解項目を1つずつ振り返って「次は正解できる説明」を自分の言葉でまとめます。

🔄 振り返りチェック

  • 全15問を解き終わりましたか?(飛ばしてOK、飛ばした問題もメモ)
  • 自己採点が終わりましたか?
  • 「間違えた/自信がなかった」問題を3つ書き出せましたか?

補足資料

  • 参考リンク: これまでの全セッション資料
  • 発展課題: 友達や同僚に向けて「自分が一番自信を持って解答できた問題」と「その理由」をプレゼンしてみる

学習ガイド

想定される質問と回答例

質問 ヒント
解答と少し違う書き方をしてしまった 結果が同じならOK。SQLは書き方が複数ある言語。AIに「同じ結果か」確認してもらう
何も思い出せない問題があった 該当セッションのファイルに戻って読み直す。「思い出せない」のは復習すべき項目という良いサイン
採点はAIに任せていい? OK。「次のSQL問題に対する私の解答を採点して、間違いがあれば理由付きで指摘して」と頼む
時間内に終わらなかった 全問解くより、解いた問題の理解度の方が大事。残りは Session13 で振り返り対象に

つまずきやすいポイント

つまずきポイント ヒント
解答例を先に見てしまう 隠す工夫を:紙で覆う、別ファイルに問題だけコピー、AIに問題だけ表示してもらう
「分からない」を飛ばさない 分からない問題は時間泥棒。飛ばして次へ、最後に余裕があれば戻る
エラーが出て止まる エラー文をそのままAIに貼って「何が起きているか教えて」が最速
読み上げを開始します...

AIに質問する