PR

【SQL】UPDATE文を1分でわかりやすく解説

Database

テーブルのレコードを更新する場合に利用するUPDATE文について、初心者向けにわかりやすく1分で解説します。

参考 SQLとは?

前提となる知識は一切必要ありません。このページ内を読めば自分ひとりでテーブルのレコード更新行うことができるようサンプルコード付きでご説明します。

このページで学べる内容
  • UPDATE文の使い方/構文ルール
    • WHERE句の利用方法
    • 複数カラムのレコード更新
  • UPDATE文利用時の注意点

プログラマーやデータベースエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識。是非最後までご覧ください。

スポンサーリンク

SQL:UPDATE文

UPDATE文は対象テーブルのレコードを更新する場合に利用します。

例えばINSERT文でレコードを誤って登録してしまった場合にUPDATE文を利用するとその誤りを修正することが可能になります。

構文ルールは以下の通り。

-- 全レコード(全行)更新
UPDATE テーブル名
   SET 列名 = 値;

-- 指定レコード更新
UPDATE テーブル名
   SET 列名 = 値
 WHERE 条件式;

--複数列更新
UPDATE テーブル名
   SET 列名 = 値,
       列名 = 値,
       列名 = 値
 WHERE 条件式;

1つひとつ順を追って解説します。

以下のようなテーブルが存在することを前提にご説明していきます。

SQL UPDATE
サンプルテーブル

上記と同じテーブル/レコードを作成したい方は以下の記事をご覧ください。

【SQL】CREATE TABLE をわかりやすく3分で解説
【SQL】INSERT文を1分でわかりやすく解説

UPDATE:全レコード更新

まずは最もシンプルなWHERE句を用いないUPDATE文から解説します。

通常、UPDATE文はWHERE句とセットで用いますがまずは理解促進のためWHERE句なしの場合のUPDATE文について解説します。

-- 全レコード(全行)更新
UPDATE テーブル名
   SET 列名 = 値;

上記のようなUPDATE文を発行すると、指定したテーブルのすべてのレコードがSET句の値で更新されます。

UPDATE PointList 
   SET Japanese = 100;

/* Japanese列がすべて「100」に更新される
+----+------+-------+----------+------+---------+
| ID | Name | Class | Japanese | Math | English |
+----+------+-------+----------+------+---------+
|  1 | 佐藤 | A     |      100 |  100 |      85 |
|  2 | 鈴木 | A     |      100 |   70 |      70 |
|  3 | 高橋 | A     |      100 |   70 |      65 |
|  4 | 中村 | A     |      100 |   65 |      85 |
|  5 | 小林 | B     |      100 |   90 |      65 |
|  6 | 山口 | B     |      100 |   85 |      85 |
|  7 | 田中 | B     |      100 |   90 |      65 |
|  8 | 伊藤 | B     |      100 |   90 |    NULL |
+----+------+-------+----------+------+---------+
*/

SET句で "Japanese = 100" と記述しているのですべてのレコードのJapanaese列が100で更新されます。

これが最も基本的なUPDATE文の動作です。

ただしほとんどの場合、すべてのレコードを一度に更新するようなことはありません。基本的には更新したいレコードを指定してUPDATE文を実行します。

更新対象のレコードを更新する場合はSELECT文DELETE文と同様にWHERE句を用います。

UPDATE:WHERE句

UPDATE文でWHERE句を用いる場合の構文ルールは以下の通り。

-- 指定レコード更新
UPDATE テーブル名
   SET 列名 = 値
 WHERE 条件式;

先ほどと同様、以下のようなテーブルを例に解説します。

SQL UPDATE
サンプルテーブル

例として、Class列が「A」のレコードのみJapanaese列を「100」にUPDATEしてみましょう。

UPDATE PointList
   SET JAPANESE = 100 
 where class ='A';

/* Class「A」のみJapanaese列がすべて「100」に更新される
+----+------+-------+----------+------+---------+
| ID | Name | Class | Japanese | Math | English |
+----+------+-------+----------+------+---------+
|  1 | 佐藤 | A     |      100 |  100 |      85 |
|  2 | 鈴木 | A     |      100 |   70 |      70 |
|  3 | 高橋 | A     |      100 |   70 |      65 |
|  4 | 中村 | A     |      100 |   65 |      85 |
|  5 | 小林 | B     |       70 |   90 |      65 |
|  6 | 山口 | B     |       90 |   85 |      85 |
|  7 | 田中 | B     |       70 |   90 |      65 |
|  8 | 伊藤 | B     |       70 |   90 |    NULL |
+----+------+-------+----------+------+---------+

ご覧のようにWHERE句で指定した条件に合致するレコードのみUPDATEがなされました。

WHERE句を用いない場合、すべてのレコードが一気に更新されてしまうため、ここは細心の注意を払う必要があります。

ただし、これだけでは不十分です。最後に、Japanaese列だけでなく、Math列やEnglish列に対しても同様に更新をかけたいような場合についてご説明します。

UPDATE文:複数列の更新

UPDATE文で複数列(複数カラム)の更新を行いたい場合は以下のようにSET句に「,」区切りで列名を順に指定します。

--複数列更新
UPDATE テーブル名
   SET 列名 = 値,
       列名 = 値,
       列名 = 値
 WHERE 条件式;

こちらも先ほどと同じテーブルを対象に以下のようなSQL文を実行してみます。

-- Class「A」の人はすべて100点にする
UPDATE PointList
   SET Japanese = 100,
       Math     = 100,
       English  = 100
 WHERE Class = 'A';

/*
+----+------+-------+----------+------+---------+
| ID | Name | Class | Japanese | Math | English |
+----+------+-------+----------+------+---------+
|  1 | 佐藤 | A     |      100 |  100 |     100 |←すべて「100」に更新
|  2 | 鈴木 | A     |      100 |  100 |     100 |←すべて「100」に更新
|  3 | 高橋 | A     |      100 |  100 |     100 |←すべて「100」に更新
|  4 | 中村 | A     |      100 |  100 |     100 |←すべて「100」に更新
|  5 | 小林 | B     |       70 |   90 |      65 |
|  6 | 山口 | B     |       90 |   85 |      85 |
|  7 | 田中 | B     |       70 |   90 |      65 |
|  8 | 伊藤 | B     |       70 |   90 |    NULL |
+----+------+-------+----------+------+---------+
*/

ご覧のようにSET句で指定したJapanaese列~English列の値が一度に更新されました。

UPDATE文のまとめ
  • UPDATE文はレコードを更新する際に利用する
  • SET句で更新対象の列(カラム)を指定する
  • WHERE句で更新対象レコードを指定する
UPDATE PointList
   SET Japanese = 100,
       Math     = 100,
       English  = 100
 WHERE Class = 'A';

/*
+----+------+-------+----------+------+---------+
| ID | Name | Class | Japanese | Math | English |
+----+------+-------+----------+------+---------+
|  1 | 佐藤 | A     |      100 |  100 |     100 |←更新対象列
|  2 | 鈴木 | A     |      100 |  100 |     100 |←更新対象列
|  3 | 高橋 | A     |      100 |  100 |     100 |←更新対象列
|  4 | 中村 | A     |      100 |  100 |     100 |←更新対象列
|  5 | 小林 | B     |       70 |   90 |      65 |
|  6 | 山口 | B     |       90 |   85 |      85 |
|  7 | 田中 | B     |       70 |   90 |      65 |
|  8 | 伊藤 | B     |       70 |   90 |    NULL |
+----+------+-------+----------+------+---------+
*/

最後にUPDATE文を利用したサンプルコードを記載しておきます。以下のコードの意味を理解できれば本ページで解説した内容の定着度はOKです。

-- テーブル作成/レコード登録
CREATE TABLE employees (
    id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    department VARCHAR(50),
    salary INT
);

INSERT INTO employees (id, first_name, last_name, department, salary)
VALUES (1, 'John', 'Doe', 'IT', 50000),
       (2, 'Jane', 'Smith', 'HR', 55000),
       (3, 'Mike', 'Brown', 'IT', 60000),
       (4, 'Nancy', 'Johnson', 'HR', 52000),
       (5, 'Tom', 'Jones', 'IT', 57000);

-- パターン1: 単一レコードの値を更新
UPDATE employees
SET salary = 55000
WHERE id = 1;

/* 結果 idが1の従業員の給与が55000に更新される
|----|------------|-----------|------------|--------|
| id | first_name | last_name | department | salary |
|----|------------|-----------|------------|--------|
| 1  | John       | Doe       | IT         | 55000  |
| 2  | Jane       | Smith     | HR         | 55000  |
| 3  | Mike       | Brown     | IT         | 60000  |
| 4  | Nancy      | Johnson   | HR         | 52000  |
| 5  | Tom        | Jones     | IT         | 57000  |
|----|------------|-----------|------------|--------|
*/


-- パターン2: 複数レコードの値を一括で更新
UPDATE employees
SET salary = salary + 5000
WHERE department = 'IT';

/* 結果 IT部門の従業員全員の給与を5000増
|----|------------|-----------|------------|--------|
| id | first_name | last_name | department | salary |
|----|------------|-----------|------------|--------|
| 1  | John       | Doe       | IT         | 60000  |
| 2  | Jane       | Smith     | HR         | 55000  |
| 3  | Mike       | Brown     | IT         | 65000  |
| 4  | Nancy      | Johnson   | HR         | 52000  |
| 5  | Tom        | Jones     | IT         | 62000  |
|----|------------|-----------|------------|--------|
*/

-- パターン3: 複数のカラムを一度に更新
UPDATE employees
SET last_name = 'White', salary = 60000
WHERE id = 2;

/* 結果 idが2の従業員の姓を'White'に変更し給与を60000に更新
|----|------------|-----------|------------|--------|
| id | first_name | last_name | department | salary |
|----|------------|-----------|------------|--------|
| 1  | John       | Doe       | IT         | 60000  |
| 2  | Jane       | White     | HR         | 60000  |
| 3  | Mike       | Brown     | IT         | 65000  |
| 4  | Nancy      | Johnson   | HR         | 52000  |
| 5  | Tom        | Jones     | IT         | 62000  |
|----|------------|-----------|------------|--------|
*/

-- パターン4: 更新条件にサブクエリを利用
UPDATE employees
SET salary = salary * 1.1
WHERE salary < (SELECT AVG(salary) FROM employees);

/* 給与が平均給与より低い従業員の給与を10%増やす(この例ではNancy Johnsonが該当)
|----|------------|-----------|------------|--------|
| id | first_name | last_name | department | salary |
|----|------------|-----------|------------|--------|
| 1  | John       | Doe       | IT         | 60000  |
| 2  | Jane       | White     | HR         | 60000  |
| 3  | Mike       | Brown     | IT         | 65000  |
| 4  | Nancy      | Johnson   | HR         | 57200  | (52000 * 1.1)
| 5  | Tom        | Jones     | IT         | 62000  |
|----|------------|-----------|------------|--------|
*/

参考 スカラ・サブクエリ

SQLを1から学習したい方は

SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。

SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?

とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。

システムエンジニアを目指したい方は

システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。

正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
DatabaseIT-Skills
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました