データベース - SQL 基本構文 - UPDATE

クラウディア 
1. 概要
2. UPDATE
3. UPDATE ~ SELECT
4. UPDATE 他のテーブルの複数条件

1. 概要

 「UPDATE」は、既存のレコードを更新するためのコマンドです。

2. UPDATE

 「UPDATE」の基本形は

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

3. UPDATE ~ SELECT

 「テーブルA」と似た構成の「テーブルB」が存在していて、双方に同じ型の「カラムC」「カラムD」が存在するとします。  「テーブルA」の「カラムC」に「テーブルA」「テーブルB」の「カラムD」が一致する「テーブルB」の「カラムC」の値で更新したいとき。

UPDATE
	テーブルA
SET
	カラムB =
	(SELECT
		カラムB
	FROM
		テーブルC
	WHERE
    	テーブルC.カラムD = テーブルA.カラムD
	);
 「IBM DB2」以外ではやってみてませんが、とりあえず「IBM DB2」ではうまくいきました。  複数行カラムも設定できます。

UPDATE
	テーブルA
SET
	(カラムB, カラムC =
	(SELECT
		カラムB, カラムC
	 FROM
		テーブルC
	 WHERE
		テーブルC.カラムE = テーブルA.カラムE
	);
 てな感じ。  別に、テーブル同士が関連づいてなくても、一定の条件をつけたり(あるいは、条件をつけなくでも)可能。

UPDATE
	テーブルA
SET
	(カラムB, カラムC =
	(SELECT
		カラムB, カラムC
	 FROM
		テーブルC
	 WHERE
		テーブルC.カラムE = 値E
	)
WHERE
	テーブルA.カラムF = 値F;
 と。  この場合、末尾の「テーブルA.」の修飾は、なくても機能します。

4. UPDATE 他のテーブルの複数条件

 前項までの更新は、「SELECT」の結果を更新の値にいれるものでしたが・・・。  テーブルAが

日時
番号
フラグ
 テーブルBが

日時
番号
氏名
 のようなものがあるとして、テーブルBを日時、番号で選択した結果によって、テーブルAのフラグを更新するとすれば、下記の「SQL」で更新できます。

UPDATE
	テーブルA
SET
	フラグ = なんかの値
WHERE
	(日時, 番号)
IN
	(
	SELECT
		 日時
		,番号
	FROM
		テーブルB
	WHERE
		テーブルBを選択する条件
	);
 これは、「IBM DB2」で検証しましたが、複雑な「SQL」ではないので、おそらくは、他のデータベースでも使えると思います。  上記の例は、単一のテーブルからの選択で条件を絞っていますが、複数のテーブルからの選択結果であっても

(項目, ...) IN
(
	SELECT
		選択結果項目, ...
	FROM
		テーブル, ...
	WHERE
		条件, ...
)
 の形式で、「IN」の前後の項目数が一致するように、しておけば、応用できます。
ハイスピードプラン