5-2. 演習問題
問題1:選択問題
Section titled “問題1:選択問題”1-1. 表からデータを検索する SQL として最も適切なのはどれか。
- A.
SELECT - B.
INSERT - C.
DELETE
1-2. 新しい行を追加する SQL として最も適切なのはどれか。
- A.
UPDATE - B.
INSERT - C.
JOIN
1-3. 既存の行の値を変更する SQL として最も適切なのはどれか。
- A.
UPDATE - B.
SELECT - C.
ORDER BY
1-4. UPDATE books SET price = 3000; が危険な理由として最も適切なのはどれか。
- A.
WHEREがなく、全行が対象になるから - B.
SELECTを先に書いていないから - C. 主キーが自動で 0 になるから
1-5. JOIN の主な役割として最も適切なのはどれか。
- A. 複数テーブルの対応する行を結び付けて読む
- B. すべての値を削除する
- C. 列名を短くする
1-6. WHERE price >= 3000 の役割として最も適切なのはどれか。
- A. 価格が 3000 以上の行だけに絞る
- B. 価格列を必ず削除する
- C. 行数を 1 件に固定する
問題2:穴埋め問題
Section titled “問題2:穴埋め問題”次の文章の空欄を埋めてください。
- 表からデータを取り出す命令は ( ) である。
- 新しい行を追加する命令は ( ) である。
- 既存の行を変更する命令は ( ) である。
- 行を削除する命令は ( ) である。
- 複数テーブルを結び付ける命令は ( ) である。
- 対象行を絞り込む条件を書く句は ( ) である。
問題3:記述問題
Section titled “問題3:記述問題”3-1. SELECT と WHERE の役割の違いを説明してください。
3-2. UPDATE や DELETE で WHERE が重要な理由を説明してください。
3-3. 正規化したテーブルで JOIN が必要になる理由を説明してください。
3-4. SQL は「どうループするか」ではなく「何が欲しいか」を書く、とはどういう意味か説明してください。
問題4:ハンズオン
Section titled “問題4:ハンズオン”次のサンプルデータを使って、SQL の読み方を練習しましょう。
authors+----+--------+| id | name |+----+--------+| 10 | Sato || 11 | Suzuki |+----+--------+
books+----+------------+-----------+-------+| id | title | author_id | price |+----+------------+-----------+-------+| 1 | Git | 10 | 2200 || 2 | JavaScript | 11 | 3200 || 3 | Network | 10 | 2800 |+----+------------+-----------+-------+下のプレイグラウンドは、この初期データが入った SQLite データベースで始まります。
UPDATE や DELETE を試したあとは、必要に応じて DBを初期化 を押して元の状態へ戻してください。
① 価格 2800 以上の本を取り出す
まずはプレイグラウンドの初期 SQL をそのまま実行する。
次の SQL が実行できれば成功:
SELECT title, priceFROM booksWHERE price >= 2800ORDER BY price DESC;結果は次のようになれば成功:
+------------+-------+| title | price |+------------+-------+| JavaScript | 3200 || Network | 2800 |+------------+-------+② 本のタイトルと著者名を一緒に出す
プレイグラウンドの SQL を次の内容へ書き換えて実行する。
次の SQL が書ければ成功:
SELECT books.title, authors.nameFROM booksJOIN authors ON books.author_id = authors.idORDER BY books.id;結果は次のようになれば成功:
+------------+--------+| title | name |+------------+--------+| Git | Sato || JavaScript | Suzuki || Network | Sato |+------------+--------+③ 価格を更新する SQL を考える
id = 3 の Network の価格を 3000 に変えて、その直後に確認用 SELECT も実行する。
次のように WHERE を付けて書ければ成功:
UPDATE booksSET price = 3000WHERE id = 3;
SELECT id, title, priceFROM booksORDER BY id;結果は次のようになれば成功:
+----+------------+-------+| id | title | price |+----+------------+-------+| 1 | Git | 2200 || 2 | JavaScript | 3200 || 3 | Network | 3000 |+----+------------+-------+④ 削除時の注意を確認する
必要なら先に DBを初期化 を押してから、id = 1 の本だけ削除し、そのあと確認用 SELECT を実行する。
次のように WHERE を付ければ成功:
DELETE FROM booksWHERE id = 1;
SELECT id, titleFROM booksORDER BY id;結果は次のようになれば成功:
+----+------------+| id | title |+----+------------+| 2 | JavaScript || 3 | Network |+----+------------+DELETE FROM books;だけだと全件削除になるUPDATEとDELETEは「どの行だけか」を毎回確認する
問題1の解答(クリックで開く)
1-1. 正解:A. SELECT
解説
- A が正しい。
SELECTは表から必要な列や行を取り出す命令である。- B の
INSERTは追加、C のDELETEは削除であり、検索ではない。SQL を学ぶときは、「読む」「追加する」「更新する」「削除する」を命令ごとに切り分けることが重要である。
1-2. 正解:B. INSERT
解説
- B が正しい。
INSERTは新しい行を追加する命令である。- A の
UPDATEは変更、C のJOINは結合であり、追加ではない。
INSERTは列の順と値の順が対応していることを意識すると理解しやすい。
1-3. 正解:A. UPDATE
解説
- A が正しい。
UPDATEは既存データの値を変更する。- B の
SELECTは読むだけである。- C の
ORDER BYは並べ替えであり、更新命令ではない。既存データへ手を入れる命令なので、対象条件を意識することが大切である。
1-4. 正解:A. WHERE がなく、全行が対象になるから
解説
- A が正しい。
UPDATEはWHEREがないと、表全体を更新しうる。- B は誤り。
SELECTを先に書く必要はない。- C は誤り。主キーの値は自動で 0 にならない。
SQL の危険性は命令の長さではなく、対象範囲が広いことにある。
1-5. 正解:A. 複数テーブルの対応する行を結び付けて読む
解説
- A が正しい。
JOINは別々のテーブルを関係に沿って結び付ける。- B は誤り。削除は
DELETEの役割である。- C は誤り。列名の長さとは無関係である。
正規化した設計では、必要な情報を画面へ出すために JOIN がよく使われる。
1-6. 正解:A. 価格が 3000 以上の行だけに絞る
解説
- A が正しい。
WHEREは条件に合う行だけを対象にする。- B は誤り。列削除とは無関係である。
- C は誤り。1 件固定にする句ではない。
WHEREは「何を対象にするか」を明確にする句であり、SQL の安全性にも直結する。
問題2の解答(クリックで開く)
- SELECT
表から必要なデータを取り出す命令である。
- INSERT
新しい行を追加する命令である。
- UPDATE
既存の行を変更する命令である。
- DELETE
行を削除する命令である。
- JOIN
複数テーブルを結び付ける命令であり、正規化後の読み取りで重要になる。
- WHERE
対象行を絞り込む条件を書く句である。更新系では特に重要である。
問題3の解答例(クリックで開く)
3-1. SELECT と WHERE の違い
SELECTはどの列を取り出すかを表し、WHEREはどの行を対象にするかを表す。 たとえばSELECT titleはタイトル列を欲しいという意味で、WHERE price >= 3000は価格条件に合う行だけに絞るという意味である。 列と行を別々に考えると整理しやすい。
3-2. WHERE が重要な理由
UPDATEやDELETEはデータを実際に変える命令なので、対象範囲を間違えると被害が大きい。WHEREがなければ全件が対象になることがあるため、毎回「どの行だけか」を明示する必要がある。 これは SQL の安全性の基本である。
3-3. 正規化後に JOIN が必要な理由
正規化すると、書籍情報と著者情報のように役割ごとにテーブルが分かれる。 そのままでは 1 つの表だけで全部の情報を読めないため、関係に沿って結び付ける JOIN が必要になる。 JOIN は、分けて保存した情報を利用時に組み立て直す手段である。
3-4. SQL の「何が欲しいか」を書く意味
SQL では「1件ずつループして探す手順」より、「この表からこの条件でこの列が欲しい」と宣言する。 つまり手順を細かく書くより、必要な結果を表現する言語だと考えると理解しやすい。 これが SQL の宣言的な性質である。
問題4の解答例(クリックで開く)
① 価格 2800 以上の本を取り出す
SELECT title, priceFROM booksWHERE price >= 2800ORDER BY price DESC;
WHERE price >= 2800によって、JavaScriptとNetworkだけが対象になる。ORDER BY price DESCを付けると、高い順に並んで結果を確認しやすい。
② タイトルと著者名を一緒に出す
SELECT books.title, authors.nameFROM booksJOIN authors ON books.author_id = authors.idORDER BY books.id;
books.author_idとauthors.idを対応付けることで、本と著者名を結び付けて読める。ORDER BY books.idを付けると、初期データの順で読み比べやすい。
③ 価格更新の SQL
UPDATE booksSET price = 3000WHERE id = 3;SELECT id, title, priceFROM booksORDER BY id;
WHERE id = 3があるため、Network1 件だけが更新対象になる。 プレイグラウンドでは 1 回の実行で複数文を続けて流せるので、更新後にすぐSELECTして結果を確認できる。
④ 削除時の注意
DELETE FROM booksWHERE id = 1;SELECT id, titleFROM booksORDER BY id;削除命令は取り返しがつきにくいため、対象条件の確認が特に重要である。
DELETE FROM books;のようにWHEREがない形は全件削除になりうる。 直前のUPDATEの影響を消したいときは、実行前に DBを初期化 を押すと元のデータへ戻せる。
考え方の図
SELECT -> 何を読むかWHERE -> どの行かJOIN -> どの表と結ぶかUPDATE -> 何を変えるかDELETE -> 何を消すかSQL を読むときは、命令の種類ごとに役割を切り分けると理解しやすい。