データベースを運用していると、特定の条件に一致する複数レコードをまとめて更新したい場面は頻繁に発生します。例えば「特定のユーザーのステータスを一括変更する」「在庫切れの商品をまとめて更新する」などです。
SQL初心者の方の中には「UPDATEは1行ずつ実行するものでは?」と考えている方もいますが、実際にはWHERE句を使えば複数行をまとめて更新できます。これはSQLの基本機能の一つであり、実務でも非常によく使われる処理です。
この記事では、SQLで複数行をUPDATEする基本構文から、複数条件・IN句・CASEを使った実践的な更新方法まで、SQL例を交えて解説します。
SQLで複数行をUPDATEする基本構文

SQLで複数行を更新する場合は、UPDATE文とWHERE句を使用します。基本構文は次の通りです。
UPDATE テーブル名
SET 列名 = 更新値
WHERE 条件
WHERE句に一致したレコードがすべて更新される仕組みです。つまり、条件に一致する行が複数存在すれば、そのすべてが更新対象になります。
例えば以下のようなユーザーテーブルがあるとします。
| id | name | status |
|---|---|---|
| 1 | Tanaka | inactive |
| 2 | Sato | inactive |
| 3 | Suzuki | active |
inactiveのユーザーをすべてactiveに更新するSQLは次のようになります。
|
1 2 3 |
UPDATE users SET status = 'active' WHERE status = 'inactive'; |
このSQLを実行すると、statusがinactiveのレコードがすべて更新されます。
WHERE条件で複数行をUPDATEするSQL例
WHERE句を使えば、特定の条件に一致する複数レコードをまとめて更新できます。
例えば「在庫が0の商品を在庫切れに変更する」場合は次のSQLになります。
|
1 2 3 |
UPDATE products SET stock_status = 'out_of_stock' WHERE stock = 0; |
更新前のデータ
| id | product | stock | stock_status |
|---|---|---|---|
| 1 | keyboard | 0 | available |
| 2 | mouse | 10 | available |
| 3 | monitor | 0 | available |
更新後
| id | product | stock | stock_status |
|---|---|---|---|
| 1 | keyboard | 0 | out_of_stock |
| 2 | mouse | 10 | available |
| 3 | monitor | 0 | out_of_stock |
このように、条件に一致する複数レコードを一度のSQLで更新できます。
複数条件でUPDATEする方法(AND / OR)
UPDATE文ではANDやORを使って複数条件を指定できます。これにより更新対象をより細かく制御できます。
主な条件の意味は次の通りです。
| 条件 | 説明 |
|---|---|
| AND | すべての条件を満たす |
| OR | いずれかの条件を満たす |
例:東京のinactiveユーザーをactiveに変更
|
1 2 3 4 |
UPDATE users SET status = 'active' WHERE status = 'inactive' AND city = 'Tokyo'; |
例:東京または大阪のユーザーを更新
|
1 2 3 4 |
UPDATE users SET status = 'active' WHERE city = 'Tokyo' OR city = 'Osaka'; |
このように複数条件を組み合わせることで、更新対象を柔軟に指定できます。
IN句で複数IDをまとめてUPDATEする方法
特定の複数レコードをまとめて更新したい場合はIN句を使用します。
例:IDが1・3・5のユーザーを更新
|
1 2 3 |
UPDATE users SET status = 'active' WHERE id IN (1,3,5); |
同じ条件をORで書くこともできます。
|
1 2 3 |
WHERE id = 1 OR id = 3 OR id = 5 |
しかしIN句を使う方がSQLがシンプルになります。
| 方法 | SQL例 |
|---|---|
| OR | id=1 OR id=3 OR id=5 |
| IN | id IN (1,3,5) |
CASEを使って複数行を異なる値でUPDATEする
CASE式を使うと、レコードごとに異なる値を設定できます。
例:ユーザーごとにポイントを変更する場合
|
1 2 3 4 5 6 7 |
UPDATE users SET point = CASE id WHEN 1 THEN 100 WHEN 2 THEN 200 WHEN 3 THEN 300 END WHERE id IN (1,2,3); |
更新結果
| id | point |
|---|---|
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
この方法はデータ移行や一括メンテナンスでよく使用されます。
UPDATE時の注意点(WHEREなしは危険)
UPDATE文で最も注意すべきポイントはWHERE句です。
WHERE句を指定しない場合、テーブルのすべてのレコードが更新されます。
例
|
1 2 |
UPDATE users SET status = 'active'; |
このSQLを実行すると、usersテーブルの全ユーザーがactiveになります。
実務では次の手順でUPDATEを実行するのが安全です。
| 手順 | 内容 |
|---|---|
| 1 | SELECTで対象レコード確認 |
| 2 | WHERE条件を確認 |
| 3 | UPDATE実行 |
例
|
1 2 |
SELECT * FROM users WHERE status = 'inactive'; |
このように対象レコードを確認してからUPDATEすることで、誤更新を防げます。
SQLのUPDATE処理が極端に遅い場合、テーブルサイズやINDEX構成が原因になっていることがあります。UPDATEが遅くなる仕組みやパフォーマンス低下の原因については、以下の記事で詳しく解説しています。

よくある質問(Q & A)
- SQLで複数行を一括更新できますか?
-
できます。UPDATE文のWHERE句を使えば、条件に一致する複数レコードをまとめて更新できます。
- UPDATEで複数列を同時に更新できますか?
-
可能です。SET句でカンマ区切りで指定します。
123UPDATE usersSET status='active', updated_at=NOW()WHERE id=1; - UPDATEで複数IDを指定する方法は?
-
IN句を使う方法が一般的です。
123UPDATE usersSET status='active'WHERE id IN (1,2,3);
まとめ
SQLではUPDATE文とWHERE句を組み合わせることで、複数行をまとめて更新できます。
基本の仕組みは「WHERE条件に一致するレコードをすべて更新する」というものです。
よく使われる更新方法は次の通りです。
| 方法 | 用途 |
|---|---|
| WHERE | 条件一致レコード更新 |
| AND / OR | 複数条件更新 |
| IN | 複数ID更新 |
| CASE | 行ごとに異なる値 |
特に注意したいのはWHERE句の指定です。WHERE句を忘れると全レコードが更新されるため、実務では必ずSELECTで対象レコードを確認してからUPDATEを実行するようにしましょう。



