✏️ Step 13: データの更新(UPDATE)
既存のデータを変更してみよう!
- UPDATE文でデータを更新する基本
- WHERE句で更新対象を指定する(超重要!)
- 複数列の同時更新
- 計算式を使った更新
- UPDATE時の注意点とエラー
- 安全な更新の手順
🎯 1. UPDATE文とは?
1-1. 既存のデータを変更する
前のステップでは、INSERT文で新しいデータを追加しました。
でも、すでに存在するデータを修正したいことも多いですよね。
- 顧客の住所を変更する
- 商品の価格を変更する
- 在庫の数量を更新する
- 注文のステータスを変更する
- ユーザーのパスワードをリセットする
そんなときに使うのがUPDATE文です!
1-2. UPDATE文の基本構文
UPDATE テーブル名 SET 列名 = 新しい値 WHERE 条件;
| 部分 | 意味 | なぜ必要? |
|---|---|---|
UPDATE テーブル名 |
どのテーブルを更新するか | 更新先を指定するため |
SET 列名 = 値 |
どの列をどの値に変更するか | 変更内容を指定するため |
WHERE 条件 |
どの行を更新するか | 更新対象を絞り込むため(超重要!) |
WHERE句を書かないと、テーブルの全ての行が更新されてしまいます!
例えば、1人の顧客の住所を変えようとして、全顧客の住所が同じになってしまう…という事故が起こります。
必ずWHERE句で対象を絞り込みましょう。
1-3. 練習用データの準備
Step 12で作成したテーブルを使います。まだ作っていない場合は、以下のSQLを実行してください。
ステップ1:顧客テーブルを作成してデータを追加
※横にスクロールできます
ステップ2:商品テーブルを作成してデータを追加
※横にスクロールできます
1-4. テーブルの内容を確認
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 1 | 田中太郎 | tanaka@example.com | 東京都 |
| 2 | 佐藤花子 | sato@example.com | 大阪府 |
| 3 | 鈴木次郎 | suzuki@example.com | 神奈川県 |
| 4 | 高橋美咲 | NULL | 福岡県 |
| 5 | 山田三郎 | yamada@example.com | 東京都 |
| 商品ID | 商品名 | 価格 | カテゴリ | 在庫数 |
|---|---|---|---|---|
| 101 | りんご | 150 | 果物 | 50 |
| 102 | みかん | 100 | 果物 | 30 |
| 103 | バナナ | 120 | 果物 | 8 |
| 104 | オレンジジュース | 160 | 飲料 | 25 |
| 105 | お茶 | 120 | 飲料 | 5 |
✏️ 2. 基本的なUPDATE
2-1. 1つの列を更新する
田中太郎さんのメールアドレスを変更してみましょう。
安全な手順1:まずSELECTで確認
※横にスクロールできます
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 1 | 田中太郎 | tanaka@example.com | 東京都 |
対象が1人だけであることを確認!
安全な手順2:UPDATEを実行
※横にスクロールできます
| 部分 | 意味 |
|---|---|
UPDATE 顧客 |
顧客テーブルを更新する |
SET メール = 'tanaka_new@example.com' |
メール列を新しい値に変更 |
WHERE 顧客ID = 1 |
顧客ID が1の人だけ(田中太郎さん) |
安全な手順3:更新後を確認
※横にスクロールできます
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 1 | 田中太郎 | tanaka_new@example.com | 東京都 |
メールアドレスが変更されました!
2-2. 商品価格を変更する
りんご(商品ID: 101)の価格を180円に変更してみましょう。
※横にスクロールできます
確認してみましょう。
※横にスクロールできます
| 商品ID | 商品名 | 価格 | カテゴリ | 在庫数 |
|---|---|---|---|---|
| 101 | りんご | 180 | 果物 | 50 |
価格が150円→180円に変更されました!
📝 3. 複数列の同時更新
3-1. 複数の列をまとめて更新
SETの後に、カンマで区切って複数の列を指定できます。
UPDATE テーブル名
SET
列1 = 値1,
列2 = 値2,
列3 = 値3
WHERE 条件;
3-2. 顧客情報を一括変更
佐藤花子さん(顧客ID: 2)のメールと都道府県を同時に変更してみましょう。
※横にスクロールできます
| 部分 | 意味 |
|---|---|
SET メール = '...', |
メール列を変更(カンマで次へ続く) |
都道府県 = '京都府' |
都道府県列も同時に変更 |
確認してみましょう。
※横にスクロールできます
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 2 | 佐藤花子 | sato_new@example.com | 京都府 |
2つの列が同時に変更されました!
3-3. 商品情報を一括変更
みかん(商品ID: 102)の価格、カテゴリ、在庫数を同時に変更してみましょう。
※横にスクロールできます
- 効率的:1回のSQL文で複数の変更ができる
- 安全:関連する変更を一度に実行できる
- 読みやすい:何を変更したかが明確
🎯 4. WHERE句で更新対象を絞り込む
4-1. 様々な条件で絞り込む
WHERE句を使って、更新する行を細かく指定できます。SELECTのWHERE句と同じ書き方です。
4-2. 都道府県で絞り込む
東京都の全顧客の都道府県を「東京」に変更してみましょう。
まずSELECTで確認:
※横にスクロールできます
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 1 | 田中太郎 | tanaka_new@example.com | 東京都 |
| 5 | 山田三郎 | yamada@example.com | 東京都 |
2人が対象であることを確認!
UPDATEを実行:
※横にスクロールできます
4-3. 複数条件での絞り込み(AND)
果物カテゴリで在庫が10個未満の商品の在庫を50個に変更してみましょう。
まずSELECTで確認:
※横にスクロールできます
| 商品ID | 商品名 | 価格 | カテゴリ | 在庫数 |
|---|---|---|---|---|
| 103 | バナナ | 120 | 果物 | 8 |
バナナだけが対象であることを確認!
UPDATEを実行:
※横にスクロールできます
4-4. IN演算子を使った絞り込み
特定の都道府県の顧客に一括で変更を加えることもできます。
※横にスクロールできます
🔢 5. 計算式を使った更新
5-1. 現在の値を使って計算
SET句では、現在の値を使った計算ができます。これは実務で非常によく使います。
5-2. 在庫を増やす
りんご(商品ID: 101)の在庫を20個増やしてみましょう。
※横にスクロールできます
| 部分 | 意味 |
|---|---|
在庫数 = 在庫数 + 20 |
現在の在庫数に20を足した値に更新 |
元の在庫が50なら、50 + 20 = 70になります。
5-3. 在庫を減らす
みかん(商品ID: 102)の在庫を10個減らしてみましょう。
※横にスクロールできます
5-4. 価格を割合で変更(値上げ)
果物カテゴリの商品を全て10%値上げしてみましょう。
まずSELECTで現在の価格を確認:
※横にスクロールできます
| 商品名 | 価格 | カテゴリ |
|---|---|---|
| りんご | 180 | 果物 |
| みかん | 130 | 高級果物 |
| バナナ | 120 | 果物 |
10%値上げを実行:
※横にスクロールできます
価格 * 1.1→ 10%値上げ(元の価格の110%)価格 * 0.9→ 10%値下げ(元の価格の90%)価格 * 1.05→ 5%値上げ(元の価格の105%)
5-5. 計算結果を整数に丸める
価格が小数になってしまう場合、ROUND()関数で整数に丸めます。
※横にスクロールできます
| 部分 | 意味 |
|---|---|
ROUND(価格 * 0.95) |
5%値引きした結果を四捨五入 |
WHERE 価格 >= 150 |
150円以上の商品だけ対象 |
| 目的 | 計算式 |
|---|---|
| 在庫を増やす | 在庫数 = 在庫数 + 数量 |
| 在庫を減らす | 在庫数 = 在庫数 - 数量 |
| 10%値上げ | 価格 = 価格 * 1.1 |
| 10%値下げ | 価格 = 価格 * 0.9 |
| 100円引き | 価格 = 価格 - 100 |
⚠️ 6. UPDATE時の注意点とエラー
6-1. 最重要:WHERE句を忘れない!
これが最も重要です。WHERE句がないと、全ての行が更新されてしまいます。
※横にスクロールできます
結果:全顧客の都道府県が「東京都」になってしまう!
大阪府の佐藤さんも、福岡県の高橋さんも、全員「東京都」に…
6-2. NOT NULL制約違反
NOT NULL制約がついた列にNULLを入れようとすると、エラーになります。
※横にスクロールできます
6-3. データ型の不一致
列のデータ型と異なる値を入れると、エラーになることがあります。
※横にスクロールできます
6-4. 主キーの更新は非推奨
主キーを更新することはあまり推奨されません。他のテーブルから参照されている場合、整合性が崩れる可能性があります。
例えば、顧客ID を1から999に変更すると…
- 注文テーブルの「顧客ID = 1」のデータが孤立する
- 「顧客ID = 1の注文」が「存在しない顧客の注文」になってしまう
対策:主キーは変更しない設計にしましょう。
🛡️ 7. 安全な更新の手順
7-1. 4ステップで安全に更新
UPDATEは間違えると大変なので、以下の手順を必ず守りましょう。
- SELECT文で対象を確認する
- 対象件数が正しいか確認する
- UPDATE文を実行する
- 再度SELECT文で結果を確認する
7-2. 実践例:安全な更新手順
高橋美咲さん(顧客ID: 4)のメールアドレスを設定する例を見てみましょう。
ステップ1:SELECTで対象を確認
※横にスクロールできます
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 4 | 高橋美咲 | NULL | 福岡県 |
✅ 対象が1人だけ、メールがNULLであることを確認!
ステップ2:対象件数を確認
※横にスクロールできます
結果:1
✅ 1件だけが対象であることを確認!
ステップ3:UPDATEを実行
※横にスクロールできます
ステップ4:結果を確認
※横にスクロールできます
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 4 | 高橋美咲 | takahashi@example.com | 福岡県 |
✅ メールアドレスが正しく設定されました!
💼 8. 実務でよく使うUPDATEパターン
8-1. 在庫の減算(商品購入時)
商品が購入されたら、在庫を減らします。ただし、在庫が足りる場合のみ実行します。
※横にスクロールできます
AND 在庫数 >= 5を追加することで、在庫が5個以上ある場合のみ減算されます。
在庫が4個以下の場合は、何も更新されません(エラーにもなりません)。
8-2. NULLの置き換え
メールアドレスが未登録(NULL)の顧客に、デフォルト値を設定します。
※横にスクロールできます
NULLかどうかを確認するには= NULLではなくIS NULLを使います。
8-3. 在庫切れ商品のフラグ設定
在庫が0の商品に「販売停止」フラグを設定します(この例では商品テーブルに「販売中」列があると仮定)。
※横にスクロールできます
8-4. 一括値上げ・値下げ
特定のカテゴリの商品を一括で値上げします。
※横にスクロールできます
- 消費税率変更時:全商品の価格を一括更新
- セール時:特定カテゴリを一括値下げ
- 仕入れ値変更時:特定メーカーの商品を一括値上げ
8-5. 文字列の連結
商品名の前に「新」を追加します。
※横にスクロールできます
||は文字列を連結する演算子です。
例:'新' || 'りんご' → '新りんご'
📝 Step 13 のまとめ
| 学んだこと | 内容 |
|---|---|
| UPDATE文 | 既存のデータを変更する |
| WHERE句 | 更新対象を絞り込む(超重要!) |
| 複数列の更新 | SETの後にカンマで区切って指定 |
| 計算式を使った更新 | 在庫数 = 在庫数 + 10 など |
| 注意点 | WHERE句忘れ、NOT NULL制約など |
| 安全な手順 | SELECT確認→UPDATE→再確認 |
-- 1列の更新
UPDATE テーブル名
SET 列名 = 新しい値
WHERE 条件;
-- 複数列の更新
UPDATE テーブル名
SET
列1 = 値1,
列2 = 値2
WHERE 条件;
WHERE句を書かないと全ての行が更新されます!
更新前に必ずSELECT文で対象を確認しましょう。
UPDATE文でデータを更新できるようになりました!
次のStep 14では、データの削除(DELETE)を学びます。不要になったデータを削除する方法を学びます。
📝 練習問題
UPDATE文を使いこなせるように練習しましょう!
メールアドレスの変更
顧客テーブルで、顧客IDが1の顧客のメールを’new_tanaka@example.com’に変更してください。
※横にスクロールできます
解説:WHERE句で対象を1人に絞り込んでから更新します。
商品価格の変更
商品テーブルで、商品IDが101の商品の価格を200円に変更してください。
※横にスクロールできます
解説:数値はクォートなしで指定します。
在庫数の更新
商品テーブルで、商品IDが102の商品の在庫数を80個に変更してください。
※横にスクロールできます
解説:在庫数を直接指定して更新します。
複数列の同時更新
顧客テーブルで、顧客IDが2の顧客のメールを’updated_sato@example.com’、都道府県を’兵庫県’に同時に変更してください。
※横にスクロールできます
解説:SETの後にカンマで区切って複数の列を指定します。
在庫を増やす
商品テーブルで、商品IDが103の商品の在庫数を現在の値に30個追加してください。
※横にスクロールできます
解説:現在の値(在庫数)を使って計算できます。
在庫を減らす
商品テーブルで、商品IDが104の商品の在庫数を現在の値から10個減らしてください。
※横にスクロールできます
解説:引き算で在庫を減らします。
価格の一括変更(値上げ)
商品テーブルで、カテゴリが’飲料’の全商品の価格を10%値上げしてください。
※横にスクロールできます
解説:WHERE句でカテゴリを絞り込んで、価格を1.1倍(10%増)します。
条件付き更新(複数条件)
商品テーブルで、カテゴリが’果物’かつ在庫数が20個未満の商品の在庫数を100個に更新してください。
※横にスクロールできます
解説:ANDで複数の条件を組み合わせます。
NULLの置き換え
顧客テーブルで、メールがNULLの顧客のメールを’default@example.com’に設定してください。
※横にスクロールできます
解説:NULLかどうかはIS NULLで確認します。= NULLではありません。
計算結果を整数に丸める
商品テーブルで、価格が150円以上の商品を5%値下げしてください。結果は整数に丸めてください。
※横にスクロールできます
解説: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