update文のさまざまな使い方を、SQL文を交えてご紹介
update文には、さまざまなデータ更新の方法があります。この記事ではSQL文を交えて、さまざまな観点からupdate文の使い方を紹介します。
update文には、さまざまなデータ更新の方法があります。この記事ではSQL文を交えて、さまざまな観点からupdate文の使い方を紹介します。
スキルアップ
2023/01/26 UP
- プログラミング
- インフラエンジニア
- 開発
update文はインフラやデータベースエンジニアの仕事はもちろん、リレーショナルデータベースとやり取りする開発プロジェクトにおいても頻繁に使われます。SQLのなかでも、ぜひ押さえておきたい重要な構文です。
update文には、さまざまなデータ更新の方法があります。この記事ではSQL文を交えて、さまざまな観点からupdate文の使い方を紹介します。
SQLのupdate文とはなにか?
SQLを扱ううえで、update文の特徴を把握することは大変重要です。まずは概要について、2つの観点から取り上げます。どのような特徴があるか、確認していきましょう。
データを指定した値で上書きするSQL文
update文は、データを指定した値で更新するSQL文です。基本的な構文を、以下に示しました。
UPDATE (表の名前) SET (列名)=(セットする値) WHERE (更新する条件)
where以下の部分は、省略できます。省略した場合は、すべての行に対して同じ値がセットされることに注意してください。
update文の使い方はデータベースにより異なる
update文の基本的な使い方について、RDBMS(リレーショナルデータベース管理システム)の種類やバージョンによる違いはあまりありません。一方で細かい部分で、文法の違いがあることに注意が必要です。「同じSQLだから大丈夫だろう」とよく確認せず、うろ覚えでupdate文を実行すると、エラーとなる場合や意図しない結果が出てしまうかもしれません。
このためupdate文を使う際にはRDBMSを確認したうえで、マニュアルなどを参照し正しい文を作って実行しましょう。
基本的なupdate文の使い方
update文は、どのように使えばよいのでしょうか。MySQL8.0を用いて、基本的な2つの使い方を確認していきましょう。この記事では、以下の「自治体」表を使って解説を進めます。
番号 | 自治体名 | 都道府県 | 市区町村 | 地区番号 | 人口 | 高齢者の割合 |
---|---|---|---|---|---|---|
1 | null | 広島県 | 北広島市 | null | null | null |
2 | null | 神奈川県 | 茅ヶ崎市 | null | null | null |
3 | null | 大阪府 | 岸和田市 | null | null | null |
4 | null | 茨城県 | 鹿島市 | null | null | null |
WHERE句で更新すべきデータの条件を指定する
update文は、特定の行にある特定のデータだけを更新する目的で使われるケースが一般的です。この場合はwhere句を用いて、更新すべきデータの条件を指定する必要があります。
さきほど紹介した表には、誤りがあります。北広島市は北海道に、鹿島市は佐賀県にある自治体です。この事実を踏まえて、都道府県名を更新するupdate文を以下に示しました。
UPDATE 自治体 SET 都道府県='北海道' WHERE 番号=1; UPDATE 自治体 SET 都道府県='佐賀県' WHERE 番号=4;
上のSQL文に続いて「SELECT * FROM 自治体;」を実行し、結果を確認してみましょう。以下のように表示され、正しく修正されたことを確認できました。
番号 | 自治体名 | 都道府県 | 市区町村 | 地区番号 | 人口 | 高齢者の割合 |
---|---|---|---|---|---|---|
1 | null | 北海道 | 北広島市 | null | null | null |
2 | null | 神奈川県 | 茅ヶ崎市 | null | null | null |
3 | null | 大阪府 | 岸和田市 | null | null | null |
4 | null | 佐賀県 | 鹿島市 | null | null | null |
すべての行に同じデータを入れたい場合
where句を使わない場合、update文はすべての行を更新します。指定した列のすべてに同一のデータがセットされるため、初期値をセットする場合に便利です。
「自治体」表の「地区番号」列を0で更新するupdate文を、以下に示します。
UPDATE 自治体 SET 地区番号=0;
すべての行に対して、「地区番号」の列に0がセットされました。
番号 | 自治体名 | 都道府県 | 市区町村 | 地区番号 | 人口 | 高齢者の割合 |
---|---|---|---|---|---|---|
1 | null | 北海道 | 北広島市 | 0 | null | null |
2 | null | 神奈川県 | 茅ヶ崎市 | 0 | null | null |
3 | null | 大阪府 | 岸和田市 | 0 | null | null |
4 | null | 佐賀県 | 鹿島市 | 0 | null | null |
実務に役立つupdate文の使い方をご紹介
update文にはさまざまな更新方法が用意されており、データを有効に活用する道具として使えます。ここからは実務に役立つ6つの方法を紹介し、使い方を確認していきましょう。
複数の列を1つのupdate文で更新できる
set句で設定する値には、複数の列を指定できます。初期値をセットする列が複数ある場合も、1つのupdate文で済むメリットがあります。使う場合は、列ごとにカンマで区切りましょう。
「自治体」表の「人口」列と「高齢者の割合」列を0にセットするSQL文を、以下に示しました。
UPDATE 自治体 SET 人口=0, 高齢者の割合=0;
すべての行の「人口」と「高齢者の割合」列に、0がセットされました。
番号 | 自治体名 | 都道府県 | 市区町村 | 地区番号 | 人口 | 高齢者の割合 |
---|---|---|---|---|---|---|
1 | null | 北海道 | 北広島市 | 0 | 0 | 0 |
2 | null | 神奈川県 | 茅ヶ崎市 | 0 | 0 | 0 |
3 | null | 大阪府 | 岸和田市 | 0 | 0 | 0 |
4 | null | 佐賀県 | 鹿島市 | 0 | 0 | 0 |
更新データには複数の列の文字列を結合した値も使える
更新の際に設定するデータには、複数の列からデータを取り出し結合した値も使えます。例えば「自治体」表の「都道府県」列と「市区町村」列から取り出したデータをつなげて、別の列を更新できるわけです。以下のSQL文を実行してみましょう。
UPDATE 自治体 SET 自治体名=CONCAT(都道府県, 市区町村) WHERE 自治体名 IS NULL;
concatを使って、2つのデータをつなげています。実行により「自治体名」の列に、都道府県名と市区町村名をつなげた文字列が入りました。
番号 | 自治体名 | 都道府県 | 市区町村 | 地区番号 | 人口 | 高齢者の割合 |
---|---|---|---|---|---|---|
1 | 北海道北広島市 | 北海道 | 北広島市 | 0 | 0 | 0 |
2 | 神奈川県茅ヶ崎市 | 神奈川県 | 茅ヶ崎市 | 0 | 0 | 0 |
3 | 大阪府岸和田市 | 大阪府 | 岸和田市 | 0 | 0 | 0 |
4 | 佐賀県鹿島市 | 佐賀県 | 鹿島市 | 0 | 0 | 0 |
SET句では簡単な計算もできる
ここからは「年齢別人口」表も加えて、解説を進めます。表の内容は、以下のとおりです。
番号 | 人口 | 65歳未満人口 | 65歳以上人口 | 地区番号 |
---|---|---|---|---|
1 | null | 38535 | 19380 | null |
2 | null | 175513 | 64882 | null |
3 | null | 133990 | 53497 | null |
4 | null | 18702 | 9141 | null |
「人口」列の値は、65歳未満と65歳以上の人口を足すことで求められます。update文では計算を行なえるため、以下のSQL文を実行することで「人口」列の値を更新できます。
UPDATE 年齢別人口 SET 人口=65歳未満人口+65歳以上人口;
合計値が「人口」列に格納されました。
番号 | 人口 | 65歳未満人口 | 65歳以上人口 | 地区番号 |
---|---|---|---|---|
1 | 57915 | 38535 | 19380 | 0 |
2 | 240395 | 175513 | 64882 | 0 |
3 | 187487 | 133990 | 53497 | 0 |
4 | 27843 | 18702 | 9141 | 0 |
他の表から情報を取得して更新する
update文では、他の表から取得した情報を使って更新することも可能です。方法は2つありますが、優劣はありません。目的に応じて、適切な方法を選びましょう。
それぞれの方法について、紹介していきます。
方法1:副問合せを用いる
update文ではset句の途中で、副問合せを使えます。ここでは「年齢別人口」表の「人口」列に含まれる数値をもとに、「自治体」表の「人口」列を更新するupdate文を示しました。
UPDATE 自治体 SET 自治体.人口=(SELECT 年齢別人口.人口 FROM 年齢別人口 WHERE 自治体.番号=年齢別人口.番号);
副問合せで使われているselect文のなかでは、計算もできます。以下のupdate文は「年齢別人口」表の情報をもとに、「自治体」表の「高齢者の割合」列を更新します。
UPDATE 自治体 SET 自治体.高齢者の割合=(SELECT 年齢別人口.65歳以上人口 / 年齢別人口.人口 FROM 年齢別人口 WHERE 自治体.番号=年齢別人口.番号);
両方のupdate文を実行し、「自治体」表の「人口」列と「高齢者の割合」列が更新されたことをご確認ください。
番号 | 自治体名 | 都道府県 | 市区町村 | 地区番号 | 人口 | 高齢者の割合 |
---|---|---|---|---|---|---|
1 | 北海道北広島市 | 北海道 | 北広島市 | 0 | 57915 | 0.334628334 |
2 | 神奈川県茅ヶ崎市 | 神奈川県 | 茅ヶ崎市 | 0 | 240395 | 0.26989746 |
3 | 大阪府岸和田市 | 大阪府 | 岸和田市 | 0 | 187487 | 0.285337116 |
4 | 佐賀県鹿島市 | 佐賀県 | 鹿島市 | 0 | 27843 | 0.328305139 |
方法2:JOIN句を用いる
方法1で示したupdate文は、JOIN句を用いて書き換えることが可能です。「自治体」表の「人口」列を更新する処理は、以下のupdate文でも実行できます。
UPDATE 自治体 JOIN 年齢別人口 ON 自治体.番号=年齢別人口.番号 SET 自治体.人口=年齢別人口.人口;
JOIN句を使う場合も、set句のなかで計算式が使えます。「自治体」表の「高齢者の割合」列を更新するupdate文は、以下のように書き換え可能です。
UPDATE 自治体 JOIN 年齢別人口 ON 自治体.番号=年齢別人口.番号 SET 自治体.高齢者の割合= (年齢別人口.65歳以上人口 / 年齢別人口.人口);
両方のupdate文を実行し、「人口」列と「高齢者の割合」列が更新されたことをご確認ください。
番号 | 自治体名 | 都道府県 | 市区町村 | 地区番号 | 人口 | 高齢者の割合 |
---|---|---|---|---|---|---|
1 | 北海道北広島市 | 北海道 | 北広島市 | 0 | 57915 | 0.334628334 |
2 | 神奈川県茅ヶ崎市 | 神奈川県 | 茅ヶ崎市 | 0 | 240395 | 0.26989746 |
3 | 大阪府岸和田市 | 大阪府 | 岸和田市 | 0 | 187487 | 0.285337116 |
4 | 佐賀県鹿島市 | 佐賀県 | 鹿島市 | 0 | 27843 | 0.328305139 |
IN句はピンポイントで更新したいデータがある場合に便利
データを更新する際、対象のデータが飛び飛びとなる場合があります。ピンポイントで修正したい項目に対して、where句はあまり適していません。複数のupdate文に分けざるを得なくなりがちなことが理由です。
このようなケースには、IN句の活用が便利です。以下のupdate文では、「都道府県」列が北海道または神奈川県のデータに対して、「地区番号」列を1で更新します。
UPDATE 自治体 SET 地区番号=1 WHERE 都道府県 IN ('北海道', '神奈川県');
北海道と神奈川県の「地区番号」列が、1になりました。
番号 | 自治体名 | 都道府県 | 市区町村 | 地区番号 | 人口 | 高齢者の割合 |
---|---|---|---|---|---|---|
1 | 北海道北広島市 | 北海道 | 北広島市 | 1 | 57915 | 0.334628334 |
2 | 神奈川県茅ヶ崎市 | 神奈川県 | 茅ヶ崎市 | 1 | 240395 | 0.26989746 |
3 | 大阪府岸和田市 | 大阪府 | 岸和田市 | 0 | 187487 | 0.285337116 |
4 | 佐賀県鹿島市 | 佐賀県 | 鹿島市 | 0 | 27843 | 0.328305139 |
データに応じて更新する値を変えられる
実務では「格納されているデータによって更新する値を変えたい」というケースも、よくあります。CASE文はこのような処理に便利です。以下のupdate文は、都道府県によって「地区番号」列を更新する値が変わることが特徴です。
UPDATE 自治体 SET 地区番号= CASE 都道府県 WHEN '北海道' THEN 1 WHEN '茨城県' THEN 3 WHEN '神奈川県' THEN 3 WHEN '大阪府' THEN 6 WHEN '広島県' THEN 7 WHEN '佐賀県' THEN 9 END;
WHENを増やすことで、場合分けのケースを増やせます。最後に「END;」を忘れないようにしましょう。実行により、都道府県に対応する地区番号の値がセットされます。
番号 | 自治体名 | 都道府県 | 市区町村 | 地区番号 | 人口 | 高齢者の割合 |
---|---|---|---|---|---|---|
1 | 北海道北広島市 | 北海道 | 北広島市 | 1 | 57915 | 0.334628334 |
2 | 神奈川県茅ヶ崎市 | 神奈川県 | 茅ヶ崎市 | 3 | 240395 | 0.26989746 |
3 | 大阪府岸和田市 | 大阪府 | 岸和田市 | 6 | 187487 | 0.285337116 |
4 | 佐賀県鹿島市 | 佐賀県 | 鹿島市 | 9 | 27843 | 0.328305139 |
update文を使ううえでの注意点
update文はデータを改変するSQL文です。変更を確定すると、元のデータは残りません。誤って実行するとデータを破壊するおそれがあるため、扱いには十分な注意が必要です。
ここからは、update文を使ううえで押さえておきたい注意点を3つ取り上げ解説します。
更新すべきデータの条件をよく確認する
データを更新する際は、対象のデータがきちんと更新されるかという点に目が向きがちです。しかし実務では、「更新すべきでないデータが更新されずに済むか」という点も大変重要です。なぜなら目的のデータ以外を更新してしまうことによりデータに不整合が生じ、金額の誤りなど実務に悪影響をおよぼしかねないためです。
このためupdate文を実行する際は、極力where句などを設定して範囲を絞りましょう。事前にselect文を実行して、更新対象とすべきデータを確認する方法も有効です。
他の表との整合性のチェックも忘れずに
データは、他の表から参照されているケースもしばしばあります。実務では、意外な箇所から参照されていることに驚きを感じた方もいるのではないでしょうか。
他の表から参照されているデータを安易に更新すると、その後の処理が失敗する、処理結果に誤りが生じるなどの悪影響が生じます。設計書などを確認し、更新対象のデータが他の表から参照されていないか、事前にチェックしておきましょう。
簡潔でわかりやすいupdate文を作成する
簡潔でわかりやすいupdate文の作成も、重要なポイントに挙げられます。複雑なSQL文には、以下のデメリットがあるためです。
・ひと目でどのような処理をしているかわかりにくい
・バグや操作ミスの原因となる
・トラブルが発生した際の調査に時間を要する原因となる
作成したupdate文は、いつまでも作成者本人がメンテナンスするとは限りません。業務を円滑に進めるためにも、簡潔さとわかりやすさを心がけて作成しましょう。
update文を駆使して実務に役立てよう
update文の奥深さに気付いた方も、多いのではないでしょうか。構文を工夫することで効率的にデータを更新できることは、update文の強みです。覚えた構文が多いほど、update文を使ってより良い業務につなげられるわけです。
今はWebブラウザ上でSQL文を試せるサイトもあります。ご自身で簡単に操作を試せる時代ですので、覚えた内容をもとにupdate文を駆使し、実務に役立てることをおすすめします。