ケンジが昇給し、給与を書き換えることになりました。すでにある行を「変更する」には、どんな命令を使えばいいでしょう? そしてもし、書き換える対象を間違えてしまったら、何が起きるでしょう?
INSERTは新しい行を追加する命令でした。今回学ぶのは、すでにある行を「変更する」「消す」という、一歩間違えると取り返しがつかなくなることもある操作です。慎重に読み進めてください。
UPDATE ― 既存データを書き換える
すでにある行の値を書き換えるには、UPDATE文を使います。
UPDATE テーブル名
SET 列名 = 新しい値
WHERE 条件;
ケンジの給与を400000円から420000円に上げてみましょう。
UPDATE crew
SET salary = 420000
WHERE name = 'ケンジ';
crew テーブル(変更後、ケンジの行だけ):
| id | name | role | age | home | salary |
|---|---|---|---|---|---|
| 2 | ケンジ | パイロット | 35 | 火星 | 420000 |
SET句が「どの列を、どんな値に変えるか」を指定し、WHERE句が「どの行が対象か」を絞り込みます。複数の列を同時に変えたいときは、カンマで区切って並べます。
UPDATE crew
SET salary = 420000, role = 'チーフパイロット'
WHERE name = 'ケンジ';
WHEREを忘れると全行が対象になる怖さ
ここが、この記事でいちばん大事なところです。もし先ほどのSQLから、WHERE句だけを消してしまったら、どうなるでしょう。
-- 絶対にやってはいけない例
UPDATE crew
SET salary = 420000;
WHERE句がないUPDATE文は、「対象を絞り込む条件がない」=「テーブルの全行が対象」という意味になります。このSQLを実行すると、ユミもサクラもソラも、乗組員全員の給与が一律420000円に書き換わってしまいます。SELECT文ならWHEREを忘れても「全部表示されるだけ」で実害はありませんが、UPDATEとDELETEでWHEREを忘れると、テーブルの中身そのものが壊れます。DELETEでも同じことが起こります。
-- これも絶対にやってはいけない例
DELETE FROM crew;
WHERE句のないDELETE文は、テーブルの行を1件残らず全部消してしまいます。実際の現場で起きるSQLの事故の多くは、この「WHEREを書き忘れた」という単純なミスが原因です。UPDATE・DELETEを書くときは、必ずWHERE句とセットで書く——これを鉄則として体に染み込ませてください。
DELETE ― 行を削除する
行を削除するときは、DELETE文を使います。
DELETE FROM テーブル名
WHERE 条件;
トウマがステーションを離任することになったので、crewテーブルから該当行を削除してみましょう。
DELETE FROM crew
WHERE name = 'トウマ';
crew テーブル(削除後):
| id | name | role | age | home | salary |
|---|---|---|---|---|---|
| 1 | ユミ | エンジニア | 24 | 地球 | 320000 |
| 2 | ケンジ | パイロット | 35 | 火星 | 420000 |
| 3 | サクラ | 医師 | 41 | 地球 | 520000 |
| 4 | ハルト | 医師 | 33 | 月 | 450000 |
| 5 | レイ | 研究員 | 29 | 火星 | 380000 |
| 6 | ミドリ | パイロット | 27 | 地球 | 360000 |
| 7 | ソラ | エンジニア | 45 | 月 | 470000 |
| 9 | アカリ | エンジニア | 31 | 火星 | 350000 |
| 10 | リョウ | パイロット | 38 | NULL | 440000 |
トウマの行だけが消え、他の行はそのまま残っています。DELETEは行(データ)を消す命令であり、テーブルそのものの形(列や型の定義)は残る、という点も覚えておきましょう。
安全な手順 ― 先にSELECTで確認
UPDATEやDELETEを書くとき、いきなり実行するのではなく、まったく同じWHERE条件でSELECT文を先に実行し、対象になる行を目で確認するのが、経験を積んだ技術者の共通の習慣です。
-- 1. まずSELECTで、対象になる行を確認する
SELECT * FROM crew WHERE name = 'トウマ';
-- 2. 想定どおり1件だけヒットすることを確認してから、
-- 同じWHERE条件でDELETEを実行する
DELETE FROM crew WHERE name = 'トウマ';
SELECTの結果が「想定していた行数・想定していた行」と一致していれば、そのままUPDATEやDELETEに切り替えて実行する。もし想定より多くの行がヒットしていたら、そこでWHERE条件を見直せます。このワンクッションが、取り返しのつかないミスを防いでくれます。本番の環境ではバックアップの仕組みなども併用されますが、この「先にSELECTで確認する」習慣は、SQLを書くすべての人にとっての基本です。
UPDATE crew SET salary = 400000; というSQLを実行すると、何が起きるでしょう?
答えを見る
WHERE句がないため、crewテーブルの全乗組員の給与が一律400000円に書き換わってしまいます。
UPDATE・DELETEでWHERE句を省略すると、「絞り込みなし=全行が対象」という意味になります。実行前に、必ずWHERE句が意図したとおりに書けているか確認する習慣をつけましょう。
UPDATEとDELETEは便利だけど、WHEREを忘れた瞬間に牙をむく——これだけは絶対に覚えておいてほしい。「実行する前に、同じ条件でSELECT」——この一手間が、あなたのデータを守ってくれるよ。
UPDATEやDELETEはテーブルの中身を書き換えたり消したりする命令なので、検索が中心のSQL DIVERでは扱っていません。手元のSQLiteなどで、まずはSELECTで確認してからUPDATE・DELETEを試す——という今回の安全な手順を、実際に自分の手で体験してみるのがおすすめです。