SQL-DML テーブルのデータを更新する(UPDATE)

テーブル内のデータを更新するUPDATE(アップデート)命令について、記載しておこうと思う。特定のカラム(列)や更新したい行を絞り特定のカラム(列)の値を更新する命令である。

使用するサンプルテーブル

SQLのサンプルは以下のテーブルを使用して解説

1、テーブル名:Employee(社員テーブル)

 社員の情報を管理するテーブル

属性名
カラム名
社員ID
member_id
社員名
member_name
社員名かな
member_namekana
年齢
member_age
性別
member_gender
入社日
join_company
所属部門
dept
1佐藤 太郎さとう たろう222020/04/01営業部
2田中 花子たなか はなこ302020/12/31製造部
3鈴木 次郎すずき じろう452000/05/25総務部
4西田 梅子にしだ うめこ232019/09/01販売部
テーブル定義

2、テーブル名:Dept_Update(部署異動テーブル)

 部署の異動を管理するテーブル

属性名
カラム名
社員ID
member_id
社員名
member_name
入社日
join_company
所属部門
dept
1佐藤 太郎2020/04/01販売部
2田中 花子2020/12/31総務部
3鈴木 次郎2000/05/25製造部
4西田 梅子2019/09/01販売部

すべての列の特定のカラムの値を更新する

WHERE句を指定しない場合は、すべての行を対象として列の値を更新する。

【対応データベース】

  • MySQL
  • PostgreSQL
  • SQL Server
  • Oracle
  • Access

【基本構文】

UPDATE 表名(テーブル名)
SET    列名(カラム) = 値 ;

【SQLサンプル】

サンプルでは、すべての社員の所属部門(dept)を無所属にする。

UPDATE Employee
 SET    dept = '無所属' ;
結果

特定の行の複数列(カラム)を更新する(標準)

WHERE句を指定した場合は、条件に合致する行を対象として列の値を更新する。

【対応データベース】

  • MySQL
  • PostgreSQL
  • SQL Server
  • Oracle
  • Access

【基本構文】

--1列更新
 UPDATE 表名(テーブル名)
 SET    列名 = 値
WHERE  更新する行を特定する条件;

--複数列(カラム)更新
UPDATE 表名(テーブル名)
SET    列名1 = 値1
       ,列名2 = 値2
WHERE  更新する行を特定する条件;

【SQLサンプル1】

佐藤太郎さんの年齢を22歳から23歳に変更するSQL。佐藤太郎さんの主キーは、member_id = 1であるためWHERE句にセットする。

--佐藤太郎さんの年齢を変更
UPDATE Employee
SET    member_age = 23  --年齢
WHERE  member_id = 1;   --社員ID
結果

【SQLサンプル2】

年齢が30以上の社員の部署を変更する。

--佐藤太郎さんの年齢を変更
 UPDATE Employee
 SET    dept = '営業部'     --所属部署カラム
 WHERE  member_age >= 30    --年齢カラム
 ;

SELECTした結果でUPDATEする場合①

他のテーブルの値をSELECTし、その結果で特定行(カラム)の値をUPDATEする。

WHERE句に表名1.列と表名2.列の条件を加えることで、更新対象の行を絞ることができる。

利点としては、大量のデータを更新する場合に有効的である。update文を更新対象ごとに生成する必要がないため。

【用途】

社員が期首から部署異動が発生する場合、部署異動用のテーブルを作成しておき、EXCEL等で異動データを作成しcsv経由でテーブルにインポートする。そのテーブルを利用して期首の前日にデータを一発で更新する場合などに利用できる。

【基本構文】

 --1列更新
 UPDATE 表名1(テーブル名)
 SET 表名1.列 = 表2.列
 FROM 表名2
 WHERE 表名1.列 = 表名2.列

【SQLサンプル】

社員テーブル(Employee)に登録されている社員の部署を、部署異動テーブル(Dept_Update)に登録されている部署に置き換えるUPDATE。

UPDATE Employee
 SET Employee.dept = Dept_Update.dept
 FROM Dept_Update
 WHERE Employee.member_id = Dept_Update.member_id
 ;
結果

SELECTした結果でUPDATEする場合②

INNER/LEFT JOINを使用した、他テーブルの値をSELECTし、その結果で特定行(カラム)の値をUPDATEする。

【基本構文】

UPDATE 表名1(テーブル) 
 SET 表名1.列(カラム) = 設定する値 
 FROM 表名1(テーブル)
 (INNER/LEFT) JOIN 表名2(テーブル) ON 表名1.連結する列名 = join先テーブル名.連結する列名
 where (join先テーブルの列名を利用した更新の条件)

【SQLサンプル】

部署異動テーブル(Dept_Update)の所属部署が「製造部」に合致する社員テーブル(Employee)の社員の「入社日(join_company)」を2021/04/01に更新するサンプル。

UPDATE Employee
 SET Employee.join_company = '2021/04/01'
 FROM Employee
 INNER JOIN Dept_Update ON Employee.member_id = Dept_Update.member_id
 WHERE Dept_Update.dept = '製造部'
結果