【SQL初心者脱出】WHERE IN句を使って複数の行を更新しよう!MySQL/MariaDBで役立つテクニック
MySQLとMariaDBでWHERE INを使って複数の行を更新する方法
MySQLとMariaDBでは、WHERE IN
句を使って、複数の行を効率的に更新することができます。これは、個々の行を更新するクエリを複数回実行するよりもはるかに効率的な方法です。
構文
UPDATE table_name
SET column1 = value1, column2 = value2
WHERE column IN (value1, value2, ...);
説明
table_name
: 更新対象のテーブル名column1, column2
: 更新する列名value1, value2
: 更新する値column
:IN
句で条件を指定する列名value1, value2, ...
:IN
句で指定する条件値
例
次のクエリは、users
テーブルのstatus
列を、id
が1、2、3のレコードのstatus
をactive
に変更します。
UPDATE users
SET status = 'active'
WHERE id IN (1, 2, 3);
WHERE IN
句では、カンマ区切りで複数の値を指定することができます。IN
句の値は、文字列、数値、または日付など、任意のデータ型にすることができます。- 複数の列を更新するには、
SET
句で複数の列と値をカンマ区切りで指定します。 - WHERE句で条件を絞り込むこともできます。
利点
- 複数の行を効率的に更新できる
- コードが簡潔になる
- クエリのパフォーマンスが向上する
注意点
IN
句の値に重複があると、重複する値は1つしか更新されない- 更新する列のデータ型が一致していることを確認する必要がある
UPDATE users
SET status = 'active'
WHERE id IN (1, 2, 3);
- このクエリは、
users
テーブルを更新します。 SET
句で、status
列をactive
に更新します。WHERE
句で、id
が1、2、3のレコードのみを更新するように条件を指定します。IN
句を使って、id
列の値を1、2、3に一致するレコードを選択します。
実行結果
このクエリを実行すると、users
テーブルの以下の3つのレコードが更新されます。
id | name | email | status
----+------------+--------------+---------
1 | 田中太郎 | [email protected] | active
2 | 佐藤一郎 | [email protected] | active
3 | 鈴木二郎 | [email protected] | active
- 実際の環境に合わせて、テーブル名、列名、値などを変更してください。
JOINを使って、更新するテーブルと別のテーブルを結合し、結合条件に基づいて更新することができます。この方法は、更新する列が複数のテーブルに分散している場合に有効です。
次のクエリは、users
テーブルのstatus
列を、orders
テーブルのstatus
列がshipped
であるレコードのstatus
をactive
に変更します。
UPDATE users u
JOIN orders o ON u.id = o.user_id
SET u.status = 'active'
WHERE o.status = 'shipped';
サブクエリを使った方法
サブクエリを使って、更新するレコードのIDをリストアップすることができます。この方法は、更新するレコードの数が少ない場合に有効です。
UPDATE users
SET status = 'active'
WHERE id IN (
SELECT id FROM users
WHERE id IN (1, 2, 3)
);
LOOPを使った方法
LOOPを使って、更新するレコードを1つずつループ処理することができます。この方法は、柔軟性が高いですが、処理速度が遅くなるという欠点があります。
DECLARE id INT;
-- 1、2、3をループ処理する
SET id = 1;
WHILE id <= 3 DO
UPDATE users
SET status = 'active'
WHERE id = id;
SET id = id + 1;
END WHILE;
どの方法を選択するべきか
方法 | 利点 | 欠点 |
---|---|---|
WHERE IN句 | シンプルでわかりやすい | 更新する列が1つの場合のみ有効 |
JOIN | 複数のテーブルに分散している列を更新できる | 複雑になる可能性がある |
サブクエリ | 更新するレコードの数が少ない場合に有効 | 複数行のサブクエリは複雑になる可能性がある |
LOOP | 柔軟性が高い | 処理速度が遅い |
mysql mariadb