SQLのupdate whereについてまとめています。
SQLのupdateはwhere句で更新条件を指定
SQLのupdate文では、where句に条件を指定することで対象のレコードのみを更新できます。
mysql> update employees2 set first_name='Tarou', last_name='Yamada' where emp_no=10001; Query OK, 1 row affected (0.23 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from employees2 limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Tarou | Yamada | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | : :
【関連記事】
▶【SQL】データベースで条件を設定して更新する。WHEREを使ったUPDATEについての解説。
上記の例では、emp_no=10001のレコードを対象に更新を実行しています。
updateでwhereなしだと、全レコードを一括更新
update文でwhere句を指定しないと、全レコードに対して更新が実行されます。
mysql> update employees2 set first_name='Tarou', last_name='Yamada'; Query OK, 300025 rows affected (4.64 sec) Rows matched: 300025 Changed: 300025 Warnings: 0 mysql> select * from employees2 limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Tarou | Yamada | M | 1986-06-26 | | 10002 | 1964-06-02 | Tarou | Yamada | F | 1985-11-21 | | 10003 | 1959-12-03 | Tarou | Yamada | M | 1986-08-28 | | 10004 | 1954-05-01 | Tarou | Yamada | M | 1986-12-01 | | 10005 | 1955-01-21 | Tarou | Yamada | M | 1989-09-12 | | 10006 | 1953-04-20 | Tarou | Yamada | F | 1989-06-02 | | 10007 | 1957-05-23 | Tarou | Yamada | F | 1989-02-10 | | 10008 | 1958-02-19 | Tarou | Yamada | M | 1994-09-15 | | 10009 | 1952-04-19 | Tarou | Yamada | F | 1985-02-18 | | 10010 | 1963-06-01 | Tarou | Yamada | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.00 sec)
上記の例では、すべてのレコードのfirst_nameとlast_nameが同じ値で更新されます。
ほとんどのケースで、whereなしでupdateを実行するメリットはありません。誤ってwhere句なしでupdateしてしまった場合も、自動コミットなどをonにしていない限りロールバックが可能ですが、件数によっては時間がかかります。
参考)where句なしでupdateしちゃったとき – kagamihogeの日記
メンテナンスなどの用途でupdateを実行する際も、where句を必ず指定するようにしておくなど、ミス防止対策をしておくほうが良いでしょう。なお、あえて無条件でupdateを実行したい場合は、where 1=1という条件(常に真)を指定して実行するという方法もあります。
updateのwhere句で複数条件を指定する
updateのwhere句ではandやorを使って、複数の条件を指定することが可能です。以下は、employees2テーブルのemp_no=10001のレコードもしくは、first_nameがKyoichiかつlast_nameがMaliniakのレコードを更新するSQLです。update実行後、データが更新されたかどうかselect文で確認しています。
update employees2 set first_name='Tarou', last_name='Yamada' where emp_no=10001 or ( first_name = 'Kyoichi' and last_name = 'Maliniak' ); Query OK, 1 row affected (0.24 sec) Rows matched: 2 Changed: 1 Warnings: 0 mysql> select * from employees2 limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Tarou | Yamada | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Tarou | Yamada | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.00 sec)
条件に該当するemp_no=10001のレコードと、emp_no=10005のレコードが更新されています。
updateのwhere句で別テーブルを指定する
update対象のテーブル名を複数指定して、where句で別テーブルを使った条件を指定することが可能です。以下は、MySQLでの例です。
UPDATE items,month SET items.price=month.price WHERE items.id=month.id;
DBMSによっては、update文でfrom句を使用することができ、よりわかりやすく別テーブルを指定して条件を記述することが可能です。
【関連記事】
▶SQLのupdateの構文 独自拡張のTOP、FROM、RETURNING
SQLのupdateのwhere句のまとめ
- update文では、where句で更新条件を指定できる
- where句で1=1を指定すると、全レコードを対象に更新を実行できる
- update文で別テーブル参照が可能。DBMSによっては、updateでのFROMが使用可能