【SQL】UPDATE文の基本構文をコードと実行結果つきで解説

  • 2026.10.16
       
【SQL】UPDATE文の使い方を分かりやすく解説

SQLのUPDATE文は、テーブルにすでに登録されているデータを書き換えるために用いられます。WHERE句で条件を指定すると、条件に合う行の値だけを新しい値に変更できます。たとえば、登録したデータの入力ミスを訂正したいときや、登録時には空欄にしていた住所などの項目に、あとから値を入れたいときに使います。

UPDATE文とは

UPDATE文は、SELECT(取得)・INSERT(追加)・DELETE(削除)と並ぶ、テーブルの中身を操作するための基本的なSQL文の1つです。1つの文で、特定の行だけを変更することも、複数のカラムをまとめて変更することも、テーブルのすべての行を一度に変更することもできます。

UPDATE文を構成するそれぞれの句とその意味は以下のとおりです。

クエリ 説明
UPDATE テーブル名 更新するテーブルを指定します。
SET カラム名=値 更新するカラム名とその値を指定します。複数のカラムを更新する場合は、カンマで区切ります。
WHERE 条件 条件を指定し、合致するレコードを更新します。WHERE句を省略するとテーブル内の全レコードを更新します。

【条件にあてはまるデータを1つだけ更新する場合】

UPDATE テーブル名 SET カラム名=値 WHERE 条件;

特定のレコードのみを更新する場合は上記のようになります。

【更新する項目が複数ある場合】

複数カラムを更新する場合は以下のような記述になります。

UPDATE テーブル名 SET カラム名1=値1,カラム名2=値2,… WHERE 条件;

【全レコードを更新する場合】

テーブル内のすべてのレコードを更新する場合の記述は次のようになります。

UPDATE テーブル名 SET カラム名=値;

各項目について詳しく見ていきましょう。

  • UPDATE テーブル名

更新するテーブルを指定します。

  • SET カラム名=値

更新するカラム名とその値を指定します。複数のカラムを更新する場合は、カンマで区切ります。

  • WHERE 条件

WHERE句は、特定の条件下でのデータの絞り込みに使用されます。WHERE句の書き方は、以下の記事で解説しています。

▼あわせてチェック▼
【SQL入門】WHEREで検索条件を指定する方法を解説 【SQL入門】WHEREで検索条件を指定する方法を解説 ▶

条件を指定し、条件に合致するレコードが更新の対象になります。WHERE句を省略する場合は、テーブル内の全レコードが更新対象となります。全レコードを書き換える場面はまれなので、UPDATE文は基本的にWHERE句とセットで使うと覚えておきましょう。

これらの要素を組み合わせることで、全レコードの更新、特定レコードの更新、複数列の更新などの操作を行うことができます。構文の詳細は、MySQL公式リファレンスマニュアルのUPDATEステートメントで確認できます。

あなたのご希望に沿った案件が必ず見つかります
【フリーランス向け】高収入・好待遇の案件をご紹介

TECH MANIA フリーランス

≫まずは簡単30秒で無料お問い合わせから≪

UPDATE文の使い方

サンプルテーブル

「UPDATE」文の具体的な使い方を解説していくにあたって、サンプルとして「テスト(test)」テーブルを用意しました。

「テスト(test)」テーブル

ID(id)氏名(name)性別(gender)点数(point)
1001秋山男80
1002久保田女100
1003佐々木女65
1004佐藤男75
1005鈴木女60
1006田中男90
1007土屋女55

指定レコードの更新

指定レコード更新は、「WHERE」句を用いて、条件に合致するレコードの、指定されたカラムのデータが新しい値に更新されます。

今回は鈴木さんの「点数(point)」カラムを「65」にします。

【実行コード】

UPDATE test SET point=65 WHERE id=1005;

【実行結果】

ID(id)氏名(name)性別(gender)点数(point)
1001秋山男80
1002久保田女100
1003佐々木女65
1004佐藤男75
1005鈴木女65
1006田中男90
1007土屋女55

MySQLのコマンドラインで実行すると、更新後に次のようなメッセージが表示されます。

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

「Rows matched」はWHERE句の条件に一致した行数、「Changed」は実際に値が変わった行数です。idは主キー(重複しない値)なので、一致するのは1行だけです。もとの値と同じ値で更新した場合や、条件に一致する行がない場合は「Changed: 0」になります。

UPDATE文を実行したら、この行数が想定どおりかを確認する習慣をつけておくと、条件の書き間違いにすぐ気づけます。

指定レコードの複数カラム更新

一度のクエリでテーブルの複数列を同時に更新することもできます。

例えば、鈴木さんの「性別(gender)」カラムを「男」に、同時に「点数(point)」カラムを「70」に更新する場合、次のようなクエリになります。

【実行コード】

UPDATE test SET gender='男',point=70 WHERE id=1005;

【実行結果】

ID(id)氏名(name)性別(gender)点数(point)
1001秋山男80
1002久保田女100
1003佐々木女65
1004佐藤男75
1005鈴木男70
1006田中男90
1007土屋女55

全レコードの更新

全レコード更新はテーブル内のレコードを一度に更新します。以下のクエリは「点数(point)」カラムを100にするクエリとなります。WHERE句がないため、7行すべてが同じ値に書き換わります。

【実行コード】

UPDATE test SET point=100;

【実行結果】

ID(id)氏名(name)性別(gender)点数(point)
1001秋山男100
1002久保田女100
1003佐々木女100
1004佐藤男100
1005鈴木女100
1006田中男100
1007土屋女100

プログラミングの基礎からサイト制作まで
↓実践力が身につくプログラミングスクール↓

ITエンジニアの学校 テックマニアスクール

≫モニター割引キャンペーン実施中!≪

IN句でWHEREの対象を個別に指定する(複数指定可)

IN句を使用することで、WHERE句の条件をさらに絞り込むことができます。一度に複数のレコードを更新したいものの全てに共通する条件がない場合や、OR句を使用する代わりに便利です。

【基本構文】

UPDATE テーブル名 SET カラム名=値 WHERE カラム名 IN (値1, 値2, 値3, ...)

INの前にNOTを付けてNOT INにすることで、IN句のあとに指定した値以外の全てのレコードを更新することができます。

ただし、NOTを使用すると条件に当てはまらないデータを指定するためにテーブル内の全検索が始まってしまい、処理が重くなりやすいという欠点があります。そのため、NOT INの安易な使用は極力避けるようにしましょう。IN句の使い方は、以下の記事で解説しています。

▼あわせてチェック▼
【SQL入門】IN句の使い方やサブクエリの活用方法を解説 【SQL入門】IN句の使い方やサブクエリの活用方法を解説 ▶

【実行コード】

UPDATE test SET gender='男' WHERE id IN (1002, 1003, 1007)

【実行結果】

ID(id)氏名(name)性別(gender)点数(point)
1001秋山男80
1002久保田男100
1003佐々木男65
1004佐藤男75
1005鈴木女60
1006田中男90
1007土屋男55

UPDATE文の応用

UPDATE文は他のSQLと組み合わせることができます。以下ではその方法をいくつか紹介します。

先ほどのサンプルテーブルを再度載せておきます。

「テスト(test)」テーブル

ID(id)氏名(name)性別(gender)点数(point)
1001秋山男80
1002久保田女100
1003佐々木女65
1004佐藤男75
1005鈴木女60
1006田中男90
1007土屋女55

これに加えてもう一つ新たなテーブルを追加します。

「性別(new_gender)」テーブル

旧性別(ex_gender)性別番号(gender_number)
男1
女2

計算した結果で更新する

例として、上記テーブルにおいて、全ての「点数(point)」カラムの値を10点引く形で更新するケースを考えてみましょう。この場合のUPDATE文は以下のようになります。

【実行コード】

UPDATE test SET point=point-10;

【実行結果】

ID(id)氏名(name)性別(gender)点数(point)
1001秋山男70
1002久保田女90
1003佐々木女55
1004佐藤男65
1005鈴木女50
1006田中男80
1007土屋女45

このSQL文を実行することで、全ての生徒のテストの点数が10点低く更新されます。

数値の計算だけでなく、文字列を加工した値で更新することもできます。MySQLで文字列をつなげるときはCONCAT関数を使います。次の例では、秋山さんの「氏名(name)」の後ろに「さん」を付けています。

【実行コード】

UPDATE test SET name=CONCAT(name,'さん') WHERE id=1001;

【実行結果】

ID(id)氏名(name)性別(gender)点数(point)
1001秋山さん男80

文字列をつなげる書き方はデータベースによって異なり、PostgreSQLやOracleでは「name || ‘さん’」、SQL Serverでは「name + ‘さん’」と書きます。MySQLのCONCAT関数については、MySQL公式リファレンスの文字列関数および演算子のページで確認できます。

JOINを用いたデータ更新

UPDATE文では、JOIN句を用いて他のテーブルのデータを参照しながら、データの更新ができます。これにより、異なるテーブルに格納されているデータを組み合わせて、より柔軟なデータ更新が行えます。

個人情報の観点で「テスト(test)」テーブルの「性別(gender)」カラムのうち、「男」を「1」、「女」を「2」に変更することにしました。そこで、追加されたサンプルテーブル「性別(new_gender)」テーブルを利用し、「テスト(test)」テーブルの「性別(gender)」カラムを更新します。以下がそのクエリです。

【実行コード】

UPDATE test JOIN new_gender ON test.gender=new_gender.ex_gender SET test.gender=new_gender.gender_number;

このクエリでは、「テスト(test)」テーブルと「性別(new_gender)」テーブルを「性別(gender)」カラムで紐づけ、「性別(new_gender)」テーブルの「性別番号(gender_number)」カラムの値で「テスト(test)」テーブルの「性別(gender)」カラムを直接更新します。

なお、「UPDATE テーブル名 JOIN ~ SET ~」はMySQLの書き方です。PostgreSQLやSQL Serverでは「UPDATE ~ SET ~ FROM ~」のように書き方が変わります。詳しくはPostgreSQLのUPDATE、SQL ServerのUPDATEの公式ドキュメントで確認してください。

JOIN句の使い方は、以下の記事で解説しています。

▼あわせてチェック▼
【SQL入門】JOINでSQLのテーブルを結合する(INNER JOIN, OUTER JOIN) 【SQL入門】JOINでSQLのテーブルを結合する(INNER JOIN, OUTER JOIN) ▶

【実行結果】

ID(id)氏名(name)性別(gender)点数(point)
1001秋山180
1002久保田2100
1003佐々木265
1004佐藤175
1005鈴木260
1006田中190
1007土屋255

ちなみに、サブクエリ(副問い合わせ)で記述する場合は以下のようなコードになります。

【実行コード】

UPDATE test SET test.gender=(SELECT new_gender.gender_number FROM new_gender WHERE test.gender=new_gender.ex_gender);

カッコの中のSELECT文(サブクエリ)は、「テスト(test)」テーブルの1行ごとに実行され、その行の性別に対応する性別番号を返します。このように外側のテーブルの値を参照するサブクエリを「相関サブクエリ」と呼び、UPDATE文やDELETE文でよく使われます(MySQL公式リファレンスの相関サブクエリーのページ)。

サブクエリを使うときは、次の2点に注意しましょう。

①サブクエリが2行以上を返すとエラーになる

SETに書くサブクエリは、1行(1つの値)だけを返す必要があります。たとえば「性別(new_gender)」テーブルに「男」の行が2つあると、どちらの値で更新すればよいか決まらないため、次のエラーになります。

ERROR 1242 (21000): Subquery returns more than 1 row

②サブクエリが1行も返さないとNULLで上書きされる

反対に、対応する行が見つからない場合は、その行がNULLで上書きされます。たとえば「性別(new_gender)」テーブルに「女」の行がないと、女子生徒4人の「性別(gender)」がすべてNULLになってしまいます。これを防ぐには、WHERE句にEXISTSを加えて、対応する行がある場合だけ更新します。

【実行コード】

UPDATE test SET test.gender=(SELECT new_gender.gender_number FROM new_gender WHERE test.gender=new_gender.ex_gender)
WHERE EXISTS (SELECT 1 FROM new_gender WHERE test.gender=new_gender.ex_gender);

この書き方なら、「女」の行がない場合でも女子生徒の性別は「女」のまま残り、「男」の行だけが「1」に更新されます。EXISTSの仕様はMySQL公式リファレンスのEXISTSのページで確認できます。使い方は、以下の記事で解説しています。

▼あわせてチェック▼
【SQL】EXISTSとは?NOT EXISTS・INとの違いや使い方を実例で解説 【SQL】EXISTSとは?NOT EXISTS・INとの違いや使い方を実例で解説 ▶

CASEと組み合わせて条件分岐でデータを更新する

UPDATE文では、条件によって結果を分岐させるCASE式を組み合わせることで、レコードごとに異なるデータの更新が可能です。

※説明するうえで、現実的ではない例えになります。

「性別(gender)」カラムの値に応じて「点数(point)」カラムの値を条件分岐させて更新する例を考えます。

【実行コード】

UPDATE test SET test.point=CASE test.gender
 WHEN '男' THEN point+5  -- 男子生徒は5点加点
 WHEN '女' THEN point-5  -- 女子生徒は5点減点
 ELSE point              -- それ以外は点数を変更しない
 END;

このクエリを実行すると、「性別(gender)」の値に応じて「点数(point)」が異なる計算式で更新されます。更新結果は以下の通りです。

【実行結果】

ID(id)氏名(name)性別(gender)点数(point)
1001秋山男85
1002久保田女95
1003佐々木女60
1004佐藤男80
1005鈴木女55
1006田中男95
1007土屋女50

CASE式の仕様はMySQL公式リファレンスのフロー制御関数のページで確認できます。CASE式を使った条件分岐は、以下の記事で解説しています。

▼あわせてチェック▼
SQL|CASE式で条件分岐を処理する【SELECT句からUPDATE句まで詳しく解説】 SQL|CASE式で条件分岐を処理する【SELECT句からUPDATE句まで詳しく解説】 ▶

UPDATE文を使うときの注意点

UPDATE文はデータを直接書き換えるため、間違えるとデータを失うことがあります。実行前に次の点を確認しましょう。

WHERE句の書き忘れに注意する

WHERE句を書き忘れると、テーブルのすべての行が同じ値で上書きされます。MySQLは初期設定で「オートコミット」(1文ごとに変更を確定する)になっているため、実行した瞬間に変更が確定し、あとから元に戻せません。

事故を防ぐには、次の手順で実行するのが安全です。

  1. 同じWHERE句でSELECT文を実行し、更新対象の行を確認する
  2. BEGIN(START TRANSACTION)でトランザクションを開始してからUPDATE文を実行する
  3. 表示された行数や結果を確認し、問題なければCOMMIT、間違っていればROLLBACKする

【実行コード】

SELECT * FROM test WHERE id=1005;   -- ①対象を確認
BEGIN;                              -- ②トランザクション開始
UPDATE test SET point=65 WHERE id=1005;
COMMIT;                             -- ③問題なければ確定(戻すならROLLBACK;)

トランザクションの使い方は、MySQL公式リファレンスのSTART TRANSACTION、COMMITおよびROLLBACKのページで確認できます。

主キーの値を書き換えない

主キーのカラムもUPDATE文で書き換えられますが、すでにある値に変えようとするとエラーになります。たとえば秋山さんのidを、久保田さんと同じ1002に変えようとすると次のようになります。

UPDATE test SET id=1002 WHERE id=1001;
ERROR 1062 (23000): Duplicate entry '1002' for key 'test.PRIMARY'

エラーにならない値でも、主キーはほかのテーブルから参照されていることが多く、書き換えると関連するデータとの対応が崩れるおそれがあります。主キーはできるだけ更新しない設計にしましょう。主キーについては、以下の記事で解説しています。

▼あわせてチェック▼
【SQL】主キーとは?選び方や設定方法をわかりやすく解説 【SQL】主キーとは?選び方や設定方法をわかりやすく解説 ▶

カラムに入りきらない値はエラーになる

カラムに決められた最大の長さを超える文字列で更新しようとすると、MySQLではエラーになります。たとえば「氏名(name)」カラムがVARCHAR(10)(10文字まで)のときに、11文字の値を入れようとすると次のようになります。

ERROR 1406 (22001): Data too long for column 'name' at row 1

古いMySQLや、設定(sql_mode)を変えている環境では、エラーにならずに文字列が切り捨てられ、警告だけが出る場合があります。更新する値の長さや型が、カラムの定義に合っているかを確認しましょう。設定についてはMySQL公式リファレンスのサーバーSQLモードのページ、エラー番号の意味はMySQL公式のサーバーエラーメッセージリファレンスで確認できます。

まとめ

今回はUPDATE文を紹介しました。基本は「UPDATE テーブル名 SET カラム名=値 WHERE 条件;」の形で、WHERE句で対象の行を絞り込みます。WHERE句を書き忘れると全行が更新されるため、実行前にSELECT文で対象を確認し、実行後は更新された行数を確かめるようにしましょう。

データの追加・削除を行うINSERT文・DELETE文の使い方は、以下の記事で解説しています。

▼あわせてチェック▼
【SQL】INSERT文でデータを追加。基礎から応用例まで詳しく解説 【SQL】INSERT文でデータを追加。基礎から応用例まで詳しく解説 ▶
▼あわせてチェック▼
【SQL】データ削除「DELETE文」の使い方。全件削除・複数テーブル参照も解説 【SQL】データ削除「DELETE文」の使い方。全件削除・複数テーブル参照も解説 ▶

SQL関連記事

SQLの勉強方法は?

書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。

ただ、SQLに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。

プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。

<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~

このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。

     

Otherカテゴリの最新記事