SQL:INSERT / UPDATE / DELETE
1学習の目的
- INSERT・UPDATE・DELETE でデータそのものを書き換えられるようになる。ここまでの「見る」SQLから、「操作する」SQLへ踏み出す。
- WHEREを付け忘れる恐怖を実感し、安全にデータを変更する手順を身につける。この3つは正しく使えば強力だが、間違えると取り返しがつかない。
2基礎解説
| やりたいこと | 書き方 | 危険度 |
|---|---|---|
| 追加する | INSERT INTO products (name, price) VALUES ('新商品', 1000); | 低い |
| 変更する | UPDATE products SET price = 1000 WHERE id = 1; | 高い |
| 削除する | DELETE FROM products WHERE id = 1; | 最も高い |
- ⚠ UPDATEとDELETEはWHEREを忘れると全行が対象になる。UPDATE products SET price = 0; は全商品の価格を0円にする。エラーは出ない。これがSQLで最も恐れられている事故。
- INSERT INTO テーブル名 (列名, …) VALUES (値, …) が基本形。列名と値の順序を対応させる。指定しなかった列は既定値かNULLになる。
- UPDATE テーブル名 SET 列 = 値 WHERE 条件 が基本形。SET の対象になるのはWHEREに合った行だけ。SETの中では計算式も使える(price = price * 1.1)。
- 安全な手順は「まずSELECTで対象を確認してから、同じWHEREでUPDATE/DELETEを実行する」。影響範囲を先に目で見てから変更するのが鉄則。
- 削除には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問)
タブレットが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 は自動採番されるので指定しなくてよい。
A. エラーになる B. 何も変わらない C. 全商品の価格が0円になる D. 確認画面が出る 選択★☆☆無料
解答 == C
WHEREが無いとき、条件は「すべての行」を意味する。
C
確認は一切入らず、即座に全行が変更される。これがSQLで最も恐れられる事故の典型。取り返しがつかないので、実行前に必ずWHEREを確認する。
id=1 の price が 130000 になる
UPDATE products SET price = 130000 WHERE id = 1; と書く。
UPDATE products SET price = 130000 WHERE id = 1;
SET で「何を」「何に」変えるか、WHEREで「どの行を」対象にするかを指定する。この2つがUPDATEの必須要素。
DELETE FROM products ____ id = 7;
id=7 の商品が削除される
「〜という条件で」を意味するキーワード。
WHERE
DELETEにもWHEREが必須と考えてよい。書き忘れると全行が消えるので、UPDATE以上に慎重さが求められる。
A. いきなりUPDATEを実行する B. 同じWHERE条件でSELECTを先に実行し、対象を確認してからUPDATEする C. バックアップを取らずに実行する D. WHEREを付けずに実行してから確認する 選択★☆☆無料
解答 == B
影響範囲を先に見てから変更するのが鉄則。
B
SELECT で「これから何行が変わるか」を目で見てから実行する。同じWHERE句を使い回せば、確認した行と実際に変更される行が一致する。
PCカテゴリのpriceが1.1倍になる
SET price = price * 1.1 のように、SET の中で現在の値を使った計算ができる。
UPDATE products SET price = price * 1.1 WHERE category = 'PC';
SETの右側では、変更前の値をそのまま計算に使える。「今の価格に対して10%増やす」という相対的な変更が1行で書ける。
INSERT INTO products (name, category, price, stock)
VALUES ('商品A', 'PC', 10000, 5)____ ('商品B', 'PC', 20000, 3);
2件が同時に追加される
VALUESの組を区切る記号。
,
1回のINSERTで複数行を追加できる。1件ずつ実行するより効率的で、実務でも初期データの投入などによく使う。
A. エラーになる B. 0になる C. NULLになる(既定値が無い場合) D. 自動で計算される 選択★★☆無料
解答 == C
値を渡さなかった列は、SQL05で学んだ「値がない」状態になる。
C
指定しなかった列はNULL(もしくはテーブル定義の既定値)になる。products テーブルには既定値の定義が無いので、この場合はNULLになる。
在庫0の商品が削除される(対象は元データには無い)
DELETE FROM products WHERE stock = 0; と書く。
DELETE FROM products WHERE stock = 0;
条件に合う行が0件でもエラーにはならない。「対象が無かった」という結果が返るだけで、これはこれで正常な動作。
id=3 の stock が13になる
SET stock = stock - 5 と書く。
UPDATE products SET stock = stock - 5 WHERE id = 3;
在庫を減らす処理はまさにこの形。注文が確定するたびに、この種のUPDATEが実行されている。
4実践シナリオ(5問)
1件追加される
INSERT INTO products (name, category, price, stock) VALUES (...); と書く。
INSERT INTO products (name, category, price, stock)
VALUES ('ワイヤレスイヤホン', '周辺機器', 12000, 30);
商品登録フォームの裏側で動いているのはこのSQL。画面の入力項目が、そのままVALUESの値になる。
stock<20の商品が+50される
WHERE stock < 20 で対象を絞り、SET stock = stock + 50 で加算する。
UPDATE products SET stock = stock + 50 WHERE stock < 20;
「条件に合う複数行を一度に変更する」のがUPDATEの真価。1件ずつ手で直す必要はなく、条件さえ書けば何百件でも一括で処理できる。
該当データが削除される
DELETE FROM products WHERE name = '未設定商品'; と書く。
DELETE FROM products WHERE name = '未設定商品';
特定の名前を条件に削除するのはテストデータの片付けでよく使う。ただし本番データで名前だけを条件にするのは危険な場合もあるため、idで指定するほうが確実なこともある。
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を実行する。件数が想定と違えば、実行前に気づける。
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仕上げ課題
① 新商品の登録
「モニターアーム」を 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を学ぶ。ここまでは既にあるテーブルを操作してきたが、ついにテーブルそのものを設計する側に回る。