受講料が最大70%OFF 受講料が最大70%OFF

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が使用可能

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。