コンテンツにスキップ

5-2. 演習問題


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 件に固定する

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

  1. 表からデータを取り出す命令は (   ) である。
  2. 新しい行を追加する命令は (   ) である。
  3. 既存の行を変更する命令は (   ) である。
  4. 行を削除する命令は (   ) である。
  5. 複数テーブルを結び付ける命令は (   ) である。
  6. 対象行を絞り込む条件を書く句は (   ) である。
解答欄

3-1. SELECTWHERE の役割の違いを説明してください。

解答欄

3-2. UPDATEDELETEWHERE が重要な理由を説明してください。

解答欄

3-3. 正規化したテーブルで JOIN が必要になる理由を説明してください。

解答欄

3-4. SQL は「どうループするか」ではなく「何が欲しいか」を書く、とはどういう意味か説明してください。

解答欄

次のサンプルデータを使って、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 データベースで始まります。
UPDATEDELETE を試したあとは、必要に応じて DBを初期化 を押して元の状態へ戻してください。

SQLプレイグラウンド
ブラウザ内の SQLite で実行します / SQL は自動保存されます / Ctrl+Enter でも実行できます
結果
「実行」を押すと、ここに実行結果が表示されます。

① 価格 2800 以上の本を取り出す

まずはプレイグラウンドの初期 SQL をそのまま実行する。

次の SQL が実行できれば成功:

SELECT title, price
FROM books
WHERE price >= 2800
ORDER BY price DESC;

結果は次のようになれば成功:

+------------+-------+
| title | price |
+------------+-------+
| JavaScript | 3200 |
| Network | 2800 |
+------------+-------+

② 本のタイトルと著者名を一緒に出す

プレイグラウンドの SQL を次の内容へ書き換えて実行する。

次の SQL が書ければ成功:

SELECT books.title, authors.name
FROM books
JOIN authors ON books.author_id = authors.id
ORDER BY books.id;

結果は次のようになれば成功:

+------------+--------+
| title | name |
+------------+--------+
| Git | Sato |
| JavaScript | Suzuki |
| Network | Sato |
+------------+--------+

③ 価格を更新する SQL を考える

id = 3Network の価格を 3000 に変えて、その直後に確認用 SELECT も実行する。

次のように WHERE を付けて書ければ成功:

UPDATE books
SET price = 3000
WHERE id = 3;
SELECT id, title, price
FROM books
ORDER BY id;

結果は次のようになれば成功:

+----+------------+-------+
| id | title | price |
+----+------------+-------+
| 1 | Git | 2200 |
| 2 | JavaScript | 3200 |
| 3 | Network | 3000 |
+----+------------+-------+

④ 削除時の注意を確認する

必要なら先に DBを初期化 を押してから、id = 1 の本だけ削除し、そのあと確認用 SELECT を実行する。

次のように WHERE を付ければ成功:

DELETE FROM books
WHERE id = 1;
SELECT id, title
FROM books
ORDER BY id;

結果は次のようになれば成功:

+----+------------+
| id | title |
+----+------------+
| 2 | JavaScript |
| 3 | Network |
+----+------------+
  • DELETE FROM books; だけだと全件削除になる
  • UPDATEDELETE は「どの行だけか」を毎回確認する

問題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 が正しい。UPDATEWHERE がないと、表全体を更新しうる。
  • 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の解答(クリックで開く)
  1. SELECT

表から必要なデータを取り出す命令である。

  1. INSERT

新しい行を追加する命令である。

  1. UPDATE

既存の行を変更する命令である。

  1. DELETE

行を削除する命令である。

  1. JOIN

複数テーブルを結び付ける命令であり、正規化後の読み取りで重要になる。

  1. WHERE

対象行を絞り込む条件を書く句である。更新系では特に重要である。

問題3の解答例(クリックで開く)

3-1. SELECTWHERE の違い

SELECT はどの列を取り出すかを表し、WHERE はどの行を対象にするかを表す。 たとえば SELECT title はタイトル列を欲しいという意味で、WHERE price >= 3000 は価格条件に合う行だけに絞るという意味である。 列と行を別々に考えると整理しやすい。


3-2. WHERE が重要な理由

UPDATEDELETE はデータを実際に変える命令なので、対象範囲を間違えると被害が大きい。 WHERE がなければ全件が対象になることがあるため、毎回「どの行だけか」を明示する必要がある。 これは SQL の安全性の基本である。


3-3. 正規化後に JOIN が必要な理由

正規化すると、書籍情報と著者情報のように役割ごとにテーブルが分かれる。 そのままでは 1 つの表だけで全部の情報を読めないため、関係に沿って結び付ける JOIN が必要になる。 JOIN は、分けて保存した情報を利用時に組み立て直す手段である。


3-4. SQL の「何が欲しいか」を書く意味

SQL では「1件ずつループして探す手順」より、「この表からこの条件でこの列が欲しい」と宣言する。 つまり手順を細かく書くより、必要な結果を表現する言語だと考えると理解しやすい。 これが SQL の宣言的な性質である。

問題4の解答例(クリックで開く)

① 価格 2800 以上の本を取り出す

SELECT title, price
FROM books
WHERE price >= 2800
ORDER BY price DESC;

WHERE price >= 2800 によって、JavaScriptNetwork だけが対象になる。 ORDER BY price DESC を付けると、高い順に並んで結果を確認しやすい。


② タイトルと著者名を一緒に出す

SELECT books.title, authors.name
FROM books
JOIN authors ON books.author_id = authors.id
ORDER BY books.id;

books.author_idauthors.id を対応付けることで、本と著者名を結び付けて読める。 ORDER BY books.id を付けると、初期データの順で読み比べやすい。


③ 価格更新の SQL

UPDATE books
SET price = 3000
WHERE id = 3;
SELECT id, title, price
FROM books
ORDER BY id;

WHERE id = 3 があるため、Network 1 件だけが更新対象になる。 プレイグラウンドでは 1 回の実行で複数文を続けて流せるので、更新後にすぐ SELECT して結果を確認できる。


④ 削除時の注意

DELETE FROM books
WHERE id = 1;
SELECT id, title
FROM books
ORDER BY id;

削除命令は取り返しがつきにくいため、対象条件の確認が特に重要である。 DELETE FROM books; のように WHERE がない形は全件削除になりうる。 直前の UPDATE の影響を消したいときは、実行前に DBを初期化 を押すと元のデータへ戻せる。


考え方の図

SELECT -> 何を読むか
WHERE -> どの行か
JOIN -> どの表と結ぶか
UPDATE -> 何を変えるか
DELETE -> 何を消すか

SQL を読むときは、命令の種類ごとに役割を切り分けると理解しやすい。