確認テスト
概要
- 日程: Day 2 / セッション 12
- 時間: 16:10-16:40
- 形式: 演習
- ゴール: 全範囲を網羅する15問の確認テストを解き、現在の到達度を自己採点で把握できる
- 学習形式: 演習(個人作業)
導入(5分)
ここまで2日間、お疲れさまでした。最後に「自分の理解度の健康診断」として15問の確認テストに挑戦します。
これは点数を競うものではありません。間違えた問題こそが財産 です。「自分はどこが分かっていないか」が見えれば、研修後の学習が10倍効率化します。逆に「なんとなく合っていたけど理由は説明できない」という問題は、次のセッションで言葉にする訓練をしましょう。
進め方
- 解答例は問題の直後にあります。まず解答例を見ずに自分で考える ことが大事です
- 紙に書く・別ファイルにメモする・psqlに打ち込む、いずれもOK
- 1問につき1〜2分が目安。詰まったら一旦飛ばして先へ
- 全問終わってから自己採点。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問
employees と departments を結合し、各社員の姓名と所属部署名を表示する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 なので省略。address や created_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に貼って「何が起きているか教えて」が最速 |