SQL-DML テーブルのデータを更新する(UPDATE)
テーブル内のデータを更新するUPDATE(アップデート)命令について、記載しておこうと思う。特定のカラム(列)や更新したい行を絞り特定のカラム(列)の値を更新する命令である。
使用するサンプルテーブル
SQLのサンプルは以下のテーブルを使用して解説
1、テーブル名:Employee(社員テーブル)
社員の情報を管理するテーブル
属性名 カラム名 | 社員ID member_id | 社員名 member_name | 社員名かな member_namekana | 年齢 member_age | 性別 member_gender | 入社日 join_company | 所属部門 dept |
---|---|---|---|---|---|---|---|
1 | 佐藤 太郎 | さとう たろう | 22 | 男 | 2020/04/01 | 営業部 | |
2 | 田中 花子 | たなか はなこ | 30 | 女 | 2020/12/31 | 製造部 | |
3 | 鈴木 次郎 | すずき じろう | 45 | 男 | 2000/05/25 | 総務部 | |
4 | 西田 梅子 | にしだ うめこ | 23 | 女 | 2019/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 = '製造部'