Step 13:データの更新(UPDATE)

✏️ Step 13: データの更新(UPDATE)

既存のデータを変更してみよう!

📋 このステップで学ぶこと
  • UPDATE文でデータを更新する基本
  • WHERE句で更新対象を指定する(超重要!)
  • 複数列の同時更新
  • 計算式を使った更新
  • UPDATE時の注意点とエラー
  • 安全な更新の手順

🎯 1. UPDATE文とは?

1-1. 既存のデータを変更する

前のステップでは、INSERT文で新しいデータを追加しました。

でも、すでに存在するデータを修正したいことも多いですよね。

💡 UPDATE文が必要な場面
  • 顧客の住所を変更する
  • 商品の価格を変更する
  • 在庫の数量を更新する
  • 注文のステータスを変更する
  • ユーザーのパスワードをリセットする

そんなときに使うのがUPDATE文です!

1-2. UPDATE文の基本構文

📝 UPDATE文の基本構文
UPDATE テーブル名
SET 列名 = 新しい値
WHERE 条件;
📌 構文の各部分の意味
部分 意味 なぜ必要?
UPDATE テーブル名 どのテーブルを更新するか 更新先を指定するため
SET 列名 = 値 どの列をどの値に変更するか 変更内容を指定するため
WHERE 条件 どの行を更新するか 更新対象を絞り込むため(超重要!)
🚨 最重要:WHERE句を忘れない!

WHERE句を書かないと、テーブルの全ての行が更新されてしまいます!

例えば、1人の顧客の住所を変えようとして、全顧客の住所が同じになってしまう…という事故が起こります。

必ずWHERE句で対象を絞り込みましょう。

1-3. 練習用データの準備

Step 12で作成したテーブルを使います。まだ作っていない場合は、以下のSQLを実行してください。

ステップ1:顧客テーブルを作成してデータを追加

※横にスクロールできます

CREATE TABLE 顧客 ( 顧客ID INTEGER PRIMARY KEY, 顧客名 TEXT NOT NULL, メール TEXT, 都道府県 TEXT ); INSERT INTO 顧客 (顧客ID, 顧客名, メール, 都道府県) VALUES (1, ‘田中太郎’, ‘tanaka@example.com’, ‘東京都’), (2, ‘佐藤花子’, ‘sato@example.com’, ‘大阪府’), (3, ‘鈴木次郎’, ‘suzuki@example.com’, ‘神奈川県’), (4, ‘高橋美咲’, NULL, ‘福岡県’), (5, ‘山田三郎’, ‘yamada@example.com’, ‘東京都’);

ステップ2:商品テーブルを作成してデータを追加

※横にスクロールできます

CREATE TABLE 商品 ( 商品ID INTEGER PRIMARY KEY, 商品名 TEXT NOT NULL, 価格 INTEGER NOT NULL, カテゴリ TEXT, 在庫数 INTEGER DEFAULT 0 ); INSERT INTO 商品 (商品ID, 商品名, 価格, カテゴリ, 在庫数) VALUES (101, ‘りんご’, 150, ‘果物’, 50), (102, ‘みかん’, 100, ‘果物’, 30), (103, ‘バナナ’, 120, ‘果物’, 8), (104, ‘オレンジジュース’, 160, ‘飲料’, 25), (105, ‘お茶’, 120, ‘飲料’, 5);

1-4. テーブルの内容を確認

📋 顧客テーブル(5人)
顧客ID 顧客名 メール 都道府県
1 田中太郎 tanaka@example.com 東京都
2 佐藤花子 sato@example.com 大阪府
3 鈴木次郎 suzuki@example.com 神奈川県
4 高橋美咲 NULL 福岡県
5 山田三郎 yamada@example.com 東京都
📋 商品テーブル(5件)
商品ID 商品名 価格 カテゴリ 在庫数
101 りんご 150 果物 50
102 みかん 100 果物 30
103 バナナ 120 果物 8
104 オレンジジュース 160 飲料 25
105 お茶 120 飲料 5

✏️ 2. 基本的なUPDATE

2-1. 1つの列を更新する

田中太郎さんのメールアドレスを変更してみましょう。

安全な手順1:まずSELECTで確認

※横にスクロールできます

SELECT * FROM 顧客 WHERE 顧客ID = 1;
📋 更新前の状態
顧客ID 顧客名 メール 都道府県
1 田中太郎 tanaka@example.com 東京都

対象が1人だけであることを確認!

安全な手順2:UPDATEを実行

※横にスクロールできます

UPDATE 顧客 SET メール = ‘tanaka_new@example.com’ WHERE 顧客ID = 1;
📌 このSQLの意味
部分 意味
UPDATE 顧客 顧客テーブルを更新する
SET メール = 'tanaka_new@example.com' メール列を新しい値に変更
WHERE 顧客ID = 1 顧客ID が1の人だけ(田中太郎さん)

安全な手順3:更新後を確認

※横にスクロールできます

SELECT * FROM 顧客 WHERE 顧客ID = 1;
📋 更新後の状態
顧客ID 顧客名 メール 都道府県
1 田中太郎 tanaka_new@example.com 東京都

メールアドレスが変更されました!

2-2. 商品価格を変更する

りんご(商品ID: 101)の価格を180円に変更してみましょう。

※横にスクロールできます

UPDATE 商品 SET 価格 = 180 WHERE 商品ID = 101;

確認してみましょう。

※横にスクロールできます

SELECT * FROM 商品 WHERE 商品ID = 101;
📋 更新後の状態
商品ID 商品名 価格 カテゴリ 在庫数
101 りんご 180 果物 50

価格が150円→180円に変更されました!

📝 3. 複数列の同時更新

3-1. 複数の列をまとめて更新

SETの後に、カンマで区切って複数の列を指定できます。

📝 複数列更新の構文
UPDATE テーブル名
SET 
    列1 = 値1,
    列2 = 値2,
    列3 = 値3
WHERE 条件;

3-2. 顧客情報を一括変更

佐藤花子さん(顧客ID: 2)のメールと都道府県を同時に変更してみましょう。

※横にスクロールできます

UPDATE 顧客 SET メール = ‘sato_new@example.com’, 都道府県 = ‘京都府’ WHERE 顧客ID = 2;
📌 このSQLの意味
部分 意味
SET メール = '...', メール列を変更(カンマで次へ続く)
都道府県 = '京都府' 都道府県列も同時に変更

確認してみましょう。

※横にスクロールできます

SELECT * FROM 顧客 WHERE 顧客ID = 2;
📋 更新後の状態
顧客ID 顧客名 メール 都道府県
2 佐藤花子 sato_new@example.com 京都府

2つの列が同時に変更されました!

3-3. 商品情報を一括変更

みかん(商品ID: 102)の価格、カテゴリ、在庫数を同時に変更してみましょう。

※横にスクロールできます

UPDATE 商品 SET 価格 = 130, カテゴリ = ‘高級果物’, 在庫数 = 100 WHERE 商品ID = 102;
💡 複数列更新のメリット
  • 効率的:1回のSQL文で複数の変更ができる
  • 安全:関連する変更を一度に実行できる
  • 読みやすい:何を変更したかが明確

🎯 4. WHERE句で更新対象を絞り込む

4-1. 様々な条件で絞り込む

WHERE句を使って、更新する行を細かく指定できます。SELECTのWHERE句と同じ書き方です。

4-2. 都道府県で絞り込む

東京都の全顧客の都道府県を「東京」に変更してみましょう。

まずSELECTで確認:

※横にスクロールできます

SELECT * FROM 顧客 WHERE 都道府県 = ‘東京都’;
📋 対象となる顧客(2人)
顧客ID 顧客名 メール 都道府県
1 田中太郎 tanaka_new@example.com 東京都
5 山田三郎 yamada@example.com 東京都

2人が対象であることを確認!

UPDATEを実行:

※横にスクロールできます

UPDATE 顧客 SET 都道府県 = ‘東京’ WHERE 都道府県 = ‘東京都’;

4-3. 複数条件での絞り込み(AND)

果物カテゴリで在庫が10個未満の商品の在庫を50個に変更してみましょう。

まずSELECTで確認:

※横にスクロールできます

SELECT * FROM 商品 WHERE カテゴリ = ‘果物’ AND 在庫数 < 10;
📋 対象となる商品(1件)
商品ID 商品名 価格 カテゴリ 在庫数
103 バナナ 120 果物 8

バナナだけが対象であることを確認!

UPDATEを実行:

※横にスクロールできます

UPDATE 商品 SET 在庫数 = 50 WHERE カテゴリ = ‘果物’ AND 在庫数 < 10;

4-4. IN演算子を使った絞り込み

特定の都道府県の顧客に一括で変更を加えることもできます。

※横にスクロールできます

UPDATE 顧客 SET メール = ‘special@example.com’ WHERE 都道府県 IN (‘東京’, ‘大阪府’, ‘神奈川県’);

🔢 5. 計算式を使った更新

5-1. 現在の値を使って計算

SET句では、現在の値を使った計算ができます。これは実務で非常によく使います。

5-2. 在庫を増やす

りんご(商品ID: 101)の在庫を20個増やしてみましょう。

※横にスクロールできます

UPDATE 商品 SET 在庫数 = 在庫数 + 20 WHERE 商品ID = 101;
📌 このSQLの意味
部分 意味
在庫数 = 在庫数 + 20 現在の在庫数に20を足した値に更新

元の在庫が50なら、50 + 20 = 70になります。

5-3. 在庫を減らす

みかん(商品ID: 102)の在庫を10個減らしてみましょう。

※横にスクロールできます

UPDATE 商品 SET 在庫数 = 在庫数 – 10 WHERE 商品ID = 102;

5-4. 価格を割合で変更(値上げ)

果物カテゴリの商品を全て10%値上げしてみましょう。

まずSELECTで現在の価格を確認:

※横にスクロールできます

SELECT 商品名, 価格, カテゴリ FROM 商品 WHERE カテゴリ = ‘果物’;
📋 更新前の果物の価格
商品名 価格 カテゴリ
りんご 180 果物
みかん 130 高級果物
バナナ 120 果物

10%値上げを実行:

※横にスクロールできます

UPDATE 商品 SET 価格 = 価格 * 1.1 WHERE カテゴリ = ‘果物’;
📌 計算式の意味
  • 価格 * 1.1 → 10%値上げ(元の価格の110%)
  • 価格 * 0.9 → 10%値下げ(元の価格の90%)
  • 価格 * 1.05 → 5%値上げ(元の価格の105%)

5-5. 計算結果を整数に丸める

価格が小数になってしまう場合、ROUND()関数で整数に丸めます。

※横にスクロールできます

UPDATE 商品 SET 価格 = ROUND(価格 * 0.95) WHERE 価格 >= 150;
📌 このSQLの意味
部分 意味
ROUND(価格 * 0.95) 5%値引きした結果を四捨五入
WHERE 価格 >= 150 150円以上の商品だけ対象
💡 よく使う計算パターン
目的 計算式
在庫を増やす 在庫数 = 在庫数 + 数量
在庫を減らす 在庫数 = 在庫数 - 数量
10%値上げ 価格 = 価格 * 1.1
10%値下げ 価格 = 価格 * 0.9
100円引き 価格 = 価格 - 100

⚠️ 6. UPDATE時の注意点とエラー

6-1. 最重要:WHERE句を忘れない!

これが最も重要です。WHERE句がないと、全ての行が更新されてしまいます。

🚨 危険な例:WHERE句なし

※横にスクロールできます

— 絶対にやってはいけない! UPDATE 顧客 SET 都道府県 = ‘東京都’;

結果:全顧客の都道府県が「東京都」になってしまう!

大阪府の佐藤さんも、福岡県の高橋さんも、全員「東京都」に…

6-2. NOT NULL制約違反

NOT NULL制約がついた列にNULLを入れようとすると、エラーになります。

※横にスクロールできます

— エラー:顧客名はNOT NULLなのでNULLにできない UPDATE 顧客 SET 顧客名 = NULL WHERE 顧客ID = 1; — Error: NOT NULL constraint failed: 顧客.顧客名

6-3. データ型の不一致

列のデータ型と異なる値を入れると、エラーになることがあります。

※横にスクロールできます

— エラー:価格は数値なのに文字列を入れている UPDATE 商品 SET 価格 = ‘あいうえお’ WHERE 商品ID = 101; — Error: datatype mismatch

6-4. 主キーの更新は非推奨

主キーを更新することはあまり推奨されません。他のテーブルから参照されている場合、整合性が崩れる可能性があります。

⚠️ 主キー更新の問題

例えば、顧客ID を1から999に変更すると…

  • 注文テーブルの「顧客ID = 1」のデータが孤立する
  • 「顧客ID = 1の注文」が「存在しない顧客の注文」になってしまう

対策:主キーは変更しない設計にしましょう。

🛡️ 7. 安全な更新の手順

7-1. 4ステップで安全に更新

UPDATEは間違えると大変なので、以下の手順を必ず守りましょう。

📌 安全な更新の4ステップ
  1. SELECT文で対象を確認する
  2. 対象件数が正しいか確認する
  3. UPDATE文を実行する
  4. 再度SELECT文で結果を確認する

7-2. 実践例:安全な更新手順

高橋美咲さん(顧客ID: 4)のメールアドレスを設定する例を見てみましょう。

ステップ1:SELECTで対象を確認

※横にスクロールできます

SELECT * FROM 顧客 WHERE 顧客ID = 4;
📋 確認結果
顧客ID 顧客名 メール 都道府県
4 高橋美咲 NULL 福岡県

✅ 対象が1人だけ、メールがNULLであることを確認!

ステップ2:対象件数を確認

※横にスクロールできます

SELECT COUNT(*) FROM 顧客 WHERE 顧客ID = 4;
📋 件数確認

結果:1

✅ 1件だけが対象であることを確認!

ステップ3:UPDATEを実行

※横にスクロールできます

UPDATE 顧客 SET メール = ‘takahashi@example.com’ WHERE 顧客ID = 4;

ステップ4:結果を確認

※横にスクロールできます

SELECT * FROM 顧客 WHERE 顧客ID = 4;
📋 更新後の確認
顧客ID 顧客名 メール 都道府県
4 高橋美咲 takahashi@example.com 福岡県

✅ メールアドレスが正しく設定されました!

💼 8. 実務でよく使うUPDATEパターン

8-1. 在庫の減算(商品購入時)

商品が購入されたら、在庫を減らします。ただし、在庫が足りる場合のみ実行します。

※横にスクロールできます

UPDATE 商品 SET 在庫数 = 在庫数 – 5 WHERE 商品ID = 101 AND 在庫数 >= 5;
📌 このSQLのポイント

AND 在庫数 >= 5を追加することで、在庫が5個以上ある場合のみ減算されます。

在庫が4個以下の場合は、何も更新されません(エラーにもなりません)。

8-2. NULLの置き換え

メールアドレスが未登録(NULL)の顧客に、デフォルト値を設定します。

※横にスクロールできます

UPDATE 顧客 SET メール = ‘noreply@example.com’ WHERE メール IS NULL;
📌 IS NULLの使い方

NULLかどうかを確認するには= NULLではなくIS NULLを使います。

8-3. 在庫切れ商品のフラグ設定

在庫が0の商品に「販売停止」フラグを設定します(この例では商品テーブルに「販売中」列があると仮定)。

※横にスクロールできます

UPDATE 商品 SET 販売中 = 0 WHERE 在庫数 = 0;

8-4. 一括値上げ・値下げ

特定のカテゴリの商品を一括で値上げします。

※横にスクロールできます

UPDATE 商品 SET 価格 = ROUND(価格 * 1.08) WHERE カテゴリ = ‘飲料’;
💡 実務での活用シーン
  • 消費税率変更時:全商品の価格を一括更新
  • セール時:特定カテゴリを一括値下げ
  • 仕入れ値変更時:特定メーカーの商品を一括値上げ

8-5. 文字列の連結

商品名の前に「新」を追加します。

※横にスクロールできます

UPDATE 商品 SET 商品名 = ‘新’ || 商品名 WHERE カテゴリ = ‘果物’;
📌 || 演算子

||は文字列を連結する演算子です。

例:'新' || 'りんご''新りんご'

📝 Step 13 のまとめ

✅ このステップで学んだこと
学んだこと 内容
UPDATE文 既存のデータを変更する
WHERE句 更新対象を絞り込む(超重要!)
複数列の更新 SETの後にカンマで区切って指定
計算式を使った更新 在庫数 = 在庫数 + 10 など
注意点 WHERE句忘れ、NOT NULL制約など
安全な手順 SELECT確認→UPDATE→再確認
📝 UPDATE文の基本形
-- 1列の更新
UPDATE テーブル名
SET 列名 = 新しい値
WHERE 条件;

-- 複数列の更新
UPDATE テーブル名
SET 
    列1 = 値1,
    列2 = 値2
WHERE 条件;
🚨 絶対に忘れてはいけないこと

WHERE句を書かないと全ての行が更新されます!

更新前に必ずSELECT文で対象を確認しましょう。

🎯 次のステップへ

UPDATE文でデータを更新できるようになりました!

次のStep 14では、データの削除(DELETE)を学びます。不要になったデータを削除する方法を学びます。

📝 練習問題

UPDATE文を使いこなせるように練習しましょう!

問題 1 基本

メールアドレスの変更

顧客テーブルで、顧客IDが1の顧客のメールを’new_tanaka@example.com’に変更してください。

※横にスクロールできます

UPDATE 顧客 SET メール = ‘new_tanaka@example.com’ WHERE 顧客ID = 1;

解説:WHERE句で対象を1人に絞り込んでから更新します。

問題 2 基本

商品価格の変更

商品テーブルで、商品IDが101の商品の価格を200円に変更してください。

※横にスクロールできます

UPDATE 商品 SET 価格 = 200 WHERE 商品ID = 101;

解説:数値はクォートなしで指定します。

問題 3 基本

在庫数の更新

商品テーブルで、商品IDが102の商品の在庫数を80個に変更してください。

※横にスクロールできます

UPDATE 商品 SET 在庫数 = 80 WHERE 商品ID = 102;

解説:在庫数を直接指定して更新します。

問題 4 応用

複数列の同時更新

顧客テーブルで、顧客IDが2の顧客のメールを’updated_sato@example.com’、都道府県を’兵庫県’に同時に変更してください。

※横にスクロールできます

UPDATE 顧客 SET メール = ‘updated_sato@example.com’, 都道府県 = ‘兵庫県’ WHERE 顧客ID = 2;

解説:SETの後にカンマで区切って複数の列を指定します。

問題 5 応用

在庫を増やす

商品テーブルで、商品IDが103の商品の在庫数を現在の値に30個追加してください。

※横にスクロールできます

UPDATE 商品 SET 在庫数 = 在庫数 + 30 WHERE 商品ID = 103;

解説:現在の値(在庫数)を使って計算できます。

問題 6 応用

在庫を減らす

商品テーブルで、商品IDが104の商品の在庫数を現在の値から10個減らしてください。

※横にスクロールできます

UPDATE 商品 SET 在庫数 = 在庫数 – 10 WHERE 商品ID = 104;

解説:引き算で在庫を減らします。

問題 7 応用

価格の一括変更(値上げ)

商品テーブルで、カテゴリが’飲料’の全商品の価格を10%値上げしてください。

※横にスクロールできます

UPDATE 商品 SET 価格 = 価格 * 1.1 WHERE カテゴリ = ‘飲料’;

解説:WHERE句でカテゴリを絞り込んで、価格を1.1倍(10%増)します。

問題 8 チャレンジ

条件付き更新(複数条件)

商品テーブルで、カテゴリが’果物’かつ在庫数が20個未満の商品の在庫数を100個に更新してください。

※横にスクロールできます

UPDATE 商品 SET 在庫数 = 100 WHERE カテゴリ = ‘果物’ AND 在庫数 < 20;

解説:ANDで複数の条件を組み合わせます。

問題 9 チャレンジ

NULLの置き換え

顧客テーブルで、メールがNULLの顧客のメールを’default@example.com’に設定してください。

※横にスクロールできます

UPDATE 顧客 SET メール = ‘default@example.com’ WHERE メール IS NULL;

解説:NULLかどうかはIS NULLで確認します。= NULLではありません。

問題 10 チャレンジ

計算結果を整数に丸める

商品テーブルで、価格が150円以上の商品を5%値下げしてください。結果は整数に丸めてください。

※横にスクロールできます

UPDATE 商品 SET 価格 = ROUND(価格 * 0.95) WHERE 価格 >= 150;

解説:ROUND()関数で四捨五入して整数にします。0.95を掛けて5%値下げします。

❓ よくある質問

Q1: WHERE句を書き忘れたらどうなりますか?

全ての行が更新されてしまいます!例えば、全顧客の住所が同じになってしまう、など。非常に危険なので、必ずWHERE句を書きましょう。

Q2: 複数の列を更新する順番は関係ありますか?

いいえ、順番は関係ありません。全ての列が同時に更新されます。

Q3: UPDATEで何行更新されたか確認できますか?

はい。多くのSQLツールでは、UPDATEの実行結果として「〇行が更新されました」と表示されます。SQLiteではSELECT changes();で確認できます。

Q4: 更新を取り消すことはできますか?

通常は取り消せません。UPDATEは実行するとすぐに確定されます。重要なデータを更新する前には、必ずバックアップを取りましょう。

Q5: NULLに更新できますか?

列にNOT NULL制約がなければ可能です。SET 列名 = NULLと書きます。NOT NULL制約がある列には、NULLを設定できません。

Q6: 主キーを更新できますか?

技術的には可能ですが、推奨されません。主キーは他のテーブルから参照されている可能性があり、整合性が崩れる恐れがあります。

📝

学習メモ

SQL基礎 - Step 13

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE