SQL / LESSON 14 / SQL14

SQL:INSERT / UPDATE / DELETE

1学習の目的

2基礎解説

やりたいこと書き方危険度
追加するINSERT INTO products (name, price) VALUES ('新商品', 1000);低い
変更するUPDATE products SET price = 1000 WHERE id = 1;高い
削除するDELETE FROM products WHERE id = 1;最も高い
✅ 覚えるべき重要ポイント
  1. ⚠ UPDATEとDELETEはWHEREを忘れると全行が対象になるUPDATE products SET price = 0;全商品の価格を0円にする。エラーは出ない。これがSQLで最も恐れられている事故。
  2. INSERT INTO テーブル名 (列名, …) VALUES (値, …) が基本形。列名と値の順序を対応させる。指定しなかった列は既定値かNULLになる。
  3. UPDATE テーブル名 SET 列 = 値 WHERE 条件 が基本形。SET の対象になるのはWHEREに合った行だけ。SETの中では計算式も使える(price = price * 1.1)。
  4. 安全な手順は「まずSELECTで対象を確認してから、同じWHEREでUPDATE/DELETEを実行する」。影響範囲を先に目で見てから変更するのが鉄則。
  5. 削除には2種類ある。DELETE FROM t WHERE …条件付きで行を消すTRUNCATE TABLE tテーブルを丸ごと空にする(環境による)。用途がまったく違う。

現場使用例:新規会員登録(INSERT)、注文ステータスの更新(UPDATE)、退会処理(DELETEまたは論理削除)、在庫数の増減。実務ではSELECTよりむしろこちらのほうが慎重さを要求される

-- 追加:新商品を登録する
INSERT INTO products (name, category, price, stock)
VALUES ('タブレット', 'PC', 55000, 10);

-- 変更:1件だけ価格を直す
UPDATE products
SET price = 130000
WHERE id = 1;

-- 変更:カテゴリ全体を値上げする(計算式が使える)
UPDATE products
SET price = price * 1.1
WHERE category = 'PC';

-- 削除:1件だけ消す
DELETE FROM products
WHERE id = 7;

-- ⚠ 危険な例:WHEREを忘れると全行が対象になる
UPDATE products SET price = 0;      -- 全商品が0円に
DELETE FROM products;                -- 全商品が消える

-- ✅ 安全な手順:まずSELECTで確認してから実行する
SELECT * FROM products WHERE category = 'PC';   -- 対象を確認
UPDATE products SET price = price * 1.1 WHERE category = 'PC';  -- 同じ条件で実行

3基本ドリル(10問)

SQL14-D01 products に「タブレット」(category:'PC', price:55000, stock:10)を1件追加するSQLを書け。 コーディング★☆☆無料
期待される結果

タブレットが1件追加される

ヒント

INSERT INTO products (name, category, price, stock) VALUES ('タブレット', 'PC', 55000, 10); と書く。

模範解答
INSERT INTO products (name, category, price, stock)
VALUES ('タブレット', 'PC', 55000, 10);
解説

列名と値の順序を対応させるのがINSERTの基本。id は自動採番されるので指定しなくてよい。

SQL14-D02 UPDATE products SET price = 0; のようにWHEREを書かずに実行するとどうなるか。
A. エラーになる B. 何も変わらない C. 全商品の価格が0円になる D. 確認画面が出る
選択★☆☆無料
期待される結果

解答 == C

ヒント

WHEREが無いとき、条件は「すべての行」を意味する。

模範解答
C
解説

確認は一切入らず、即座に全行が変更される。これがSQLで最も恐れられる事故の典型。取り返しがつかないので、実行前に必ずWHEREを確認する。

SQL14-D03 id が 1 の商品の price を 130000 に変更するSQLを書け。 コーディング★☆☆無料
期待される結果

id=1 の price が 130000 になる

ヒント

UPDATE products SET price = 130000 WHERE id = 1; と書く。

模範解答
UPDATE products
SET price = 130000
WHERE id = 1;
解説

SET で「何を」「何に」変えるか、WHEREで「どの行を」対象にするかを指定する。この2つがUPDATEの必須要素。

SQL14-D04 id が 7 の商品を削除するSQLを完成させよ。 穴埋め★☆☆無料
コード
DELETE FROM products
____ id = 7;
期待される結果

id=7 の商品が削除される

ヒント

「〜という条件で」を意味するキーワード。

模範解答
WHERE
解説

DELETEにもWHEREが必須と考えてよい。書き忘れると全行が消えるので、UPDATE以上に慎重さが求められる。

SQL14-D05 安全にデータを変更するための正しい手順はどれか。
A. いきなりUPDATEを実行する B. 同じWHERE条件でSELECTを先に実行し、対象を確認してからUPDATEする C. バックアップを取らずに実行する D. WHEREを付けずに実行してから確認する
選択★☆☆無料
期待される結果

解答 == B

ヒント

影響範囲を先に見てから変更するのが鉄則。

模範解答
B
解説

SELECT で「これから何行が変わるか」を目で見てから実行する。同じWHERE句を使い回せば、確認した行と実際に変更される行が一致する。

SQL14-D06 category が 'PC' の商品すべての price を10%値上げ(price * 1.1)するSQLを書け。 コーディング★★☆無料
期待される結果

PCカテゴリのpriceが1.1倍になる

ヒント

SET price = price * 1.1 のように、SET の中で現在の値を使った計算ができる。

模範解答
UPDATE products
SET price = price * 1.1
WHERE category = 'PC';
解説

SETの右側では、変更前の値をそのまま計算に使える。「今の価格に対して10%増やす」という相対的な変更が1行で書ける。

SQL14-D07 複数の商品を一度に追加するSQLを完成させよ。 穴埋め★★☆無料
コード
INSERT INTO products (name, category, price, stock)
VALUES ('商品A', 'PC', 10000, 5)____ ('商品B', 'PC', 20000, 3);
期待される結果

2件が同時に追加される

ヒント

VALUESの組を区切る記号。

模範解答
,
解説

1回のINSERTで複数行を追加できる。1件ずつ実行するより効率的で、実務でも初期データの投入などによく使う。

SQL14-D08 INSERT INTO products (name) VALUES ('サンプル'); のように一部の列だけ指定すると、指定しなかった列(category, price, stock)はどうなるか。
A. エラーになる B. 0になる C. NULLになる(既定値が無い場合) D. 自動で計算される
選択★★☆無料
期待される結果

解答 == C

ヒント

値を渡さなかった列は、SQL05で学んだ「値がない」状態になる。

模範解答
C
解説

指定しなかった列はNULL(もしくはテーブル定義の既定値)になる。products テーブルには既定値の定義が無いので、この場合はNULLになる。

SQL14-D09 在庫が0の商品をすべて削除するSQLを書け。 コーディング★★☆無料
期待される結果

在庫0の商品が削除される(対象は元データには無い)

ヒント

DELETE FROM products WHERE stock = 0; と書く。

模範解答
DELETE FROM products
WHERE stock = 0;
解説

条件に合う行が0件でもエラーにはならない。「対象が無かった」という結果が返るだけで、これはこれで正常な動作。

SQL14-D10 id が 3 の商品の stock を、現在の値から5減らすSQLを書け(キーボードは現在18個)。 コーディング★★☆無料
期待される結果

id=3 の stock が13になる

ヒント

SET stock = stock - 5 と書く。

模範解答
UPDATE products
SET stock = stock - 5
WHERE id = 3;
解説

在庫を減らす処理はまさにこの形。注文が確定するたびに、この種のUPDATEが実行されている。

4実践シナリオ(5問)

SQL14-S01 【新商品の登録】「ワイヤレスイヤホン」を category:'周辺機器'、price:12000、stock:30 で登録するSQLを書け。 コーディング★★☆無料
期待される結果

1件追加される

ヒント

INSERT INTO products (name, category, price, stock) VALUES (...); と書く。

模範解答
INSERT INTO products (name, category, price, stock)
VALUES ('ワイヤレスイヤホン', '周辺機器', 12000, 30);
解説

商品登録フォームの裏側で動いているのはこのSQL。画面の入力項目が、そのままVALUESの値になる。

SQL14-S02 【在庫の一括補充】在庫が20個未満の商品すべてに、在庫を50個追加する(stock = stock + 50)SQLを書け。 コーディング★★☆無料
期待される結果

stock<20の商品が+50される

ヒント

WHERE stock < 20 で対象を絞り、SET stock = stock + 50 で加算する。

模範解答
UPDATE products
SET stock = stock + 50
WHERE stock < 20;
解説

「条件に合う複数行を一度に変更する」のがUPDATEの真価。1件ずつ手で直す必要はなく、条件さえ書けば何百件でも一括で処理できる。

SQL14-S03 【誤登録の削除】name が '未設定商品' の行(誤って登録されたテストデータ)をすべて削除するSQLを書け。 コーディング★★☆無料
期待される結果

該当データが削除される

ヒント

DELETE FROM products WHERE name = '未設定商品'; と書く。

模範解答
DELETE FROM products
WHERE name = '未設定商品';
解説

特定の名前を条件に削除するのはテストデータの片付けでよく使う。ただし本番データで名前だけを条件にするのは危険な場合もあるため、idで指定するほうが確実なこともある。

SQL14-S04 【安全な手順の実践】category が NULL の商品を "未分類" に更新したい。まず対象を確認するSELECTを書き、次に同じ条件でUPDATEする、2本のSQLを書け。 コーディング★★★無料
期待される結果

category IS NULL の商品が '未分類' になる

ヒント

1本目:SELECT * FROM products WHERE category IS NULL; 2本目:UPDATE products SET category = '未分類' WHERE category IS NULL;

模範解答
SELECT * FROM products WHERE category IS NULL;

UPDATE products
SET category = '未分類'
WHERE category IS NULL;
解説

同じWHERE句を2回書くのが安全な作法。SELECTで「何件が対象か」を確認してから、まったく同じ条件でUPDATEを実行する。件数が想定と違えば、実行前に気づける。

SQL14-S05 【価格改定】全商品を一律5%値上げ(price * 1.05)し、結果を整数に丸めるSQLを書け(price がNULLでない商品のみ)。 コーディング★★★無料
期待される結果

price IS NOT NULL の商品が1.05倍・整数になる

ヒント

SET price = CAST(price * 1.05 AS INTEGER) と書く。WHEREでNULLを除く。

模範解答
UPDATE products
SET price = CAST(price * 1.05 AS INTEGER)
WHERE price IS NOT NULL;
解説

SETの中でCASTも使える。計算した結果をそのまま保存するので、小数のまま残さず整数に丸めてから書き込むのが実務では一般的。

5仕上げ課題

SQL14-FINAL 【在庫管理オペレーション】倉庫担当者から3つの作業を依頼された。正しい順序でSQLを書け。

① 新商品の登録
「モニターアーム」を category:'周辺機器'、price:8000、stock:15 で登録する

② 在庫切れ商品の価格調整
stock が 0 の商品(存在すれば)の price を 0 に変更する(在庫切れ商品は販売停止のため価格を0にする社内ルール)

③ 廃盤商品の削除
name が 'サンプル品' の商品を削除する

手順:3つの操作を順番に実行し、最後に SELECT COUNT(*), SUM(stock) FROM products; で全体の件数と在庫合計を確認すること。

期待される最終確認結果
COUNT(*) | SUM(stock)
7 | 207


※ 実行前は7件・在庫合計195(NULLを除く)。モニターアームの追加とサンプル品の削除で、在庫合計がどう変わるか計算しながら組み立てること。
期待される結果

最終確認: COUNT(*)=7, SUM(stock)=207

ヒント

① INSERT で1件追加(7件→8件のはずが、③のDELETEで1件減るので最終的に7件を維持する)。② は該当0件でも構わない(元データにstock=0は無い)。③ DELETE FROM products WHERE name='サンプル品'。順序はINSERT→UPDATE→DELETEで書く。最後にSELECTで確認する。

模範解答
-- ① 新商品の登録
INSERT INTO products (name, category, price, stock)
VALUES ('モニターアーム', '周辺機器', 8000, 15);

-- ② 在庫切れ商品の価格調整
UPDATE products
SET price = 0
WHERE stock = 0;

-- ③ 廃盤商品の削除
DELETE FROM products
WHERE name = 'サンプル品';

-- 最終確認
SELECT COUNT(*), SUM(stock) FROM products;
解説

3つの操作を正しい順序で組み立てられたかが、この課題の核心だ。①で1件増え、③で1件減るので、件数は7件のまま変わらない。在庫合計は、元の195個からサンプル品の在庫3個がDELETEで丸ごと消えモニターアームの15個が新たに加わるので、195-3+15=207になる。

ここで手を止めて、自分で立てた予測とSQLの実行結果を照らし合わせる——これが実務でのデータ操作の基本動作だ。予測と結果がズレていたら、それは操作のどこかに間違いがあるサインになる。

②のUPDATEは対象が0件でもエラーにならない。これは正常な動作であり、「何も起きなかった」ことも1つの結果として受け止める。

この章で学んだINSERT・UPDATE・DELETEは、取り消しの効かない操作だ。SELECTは何度実行してもデータは壊れないが、この3つは一度実行すれば元に戻らない(バックアップが無い限り)。WHEREを2回確認する、SELECTで先に見る、小さい範囲から試す——これらはすべて、この不可逆性への対策だ。

次章ではCREATE TABLEを学ぶ。ここまでは既にあるテーブルを操作してきたが、ついにテーブルそのものを設計する側に回る。