UPDATE と JOIN を使ってデータを更新する
UPDATE と JOIN を使ってデータを更新する
前回 「 INSERT と SELECT を使って他のテーブルからデータを挿入する 」 では、 INSERT と SELECT を使って、クエリーの結果セットを元に、テーブルにデータを挿入しました。
今回は UPDATE 文を使って、テーブルのデータを更新してみましょう。
これらのテーブルを使いますので、こちら のスクリプトを実行して、テーブルを再生成しておいてください。
UPDATE 文でテーブルのデータを更新する
一番シンプルな UPDATE 文の構文は次のようなものになります。
UPDATE [テーブル1] SET [カラム1] = [値1], [カラム2] = [値1], ... WHERE [条件];
次のように書いても同じ意味です。 AS を使って T という、エイリアス(別名)を指定しています。 複数のテーブルを結合して更新したい時にはこちらを使います。
UPDATE T SET [カラム1] = [値1], [カラム2] = [値1], ... FROM [テーブル1] AS T WHERE [条件];
まずは、シンプルな UPDATE 文を見てみましょう。 以下のような TestResult テーブルがあります。
例えば、TestID = 2 のスコアを 1 点ずつ追加するには、次のような UPDATE 文で可能です。
UPDATE TestResult SET Score = Score + 1 WHERE TestID = 2;
[ 実行結果 ]
TestID = 2 のスコアを 1 点ずつ追加されましたね。
複数のテーブルを結合して、UPDATE 文でテーブルのデータを更新する
次は複数のテーブルを結合して、UPDATE 文でテーブルのデータを更新してみましょう。
現在、Test, Student, TestResult テーブルのデータは以下のような状態です。
次のクエリーで、テスト名が 「 数学1 」 の、1980 年以降に生まれた学生のスコアを 1 点ずつ追加してみましょう。
UPDATE TR SET Score = Score + 1 FROM TestResult AS TR INNER JOIN Test AS T ON TR.TestID = T.TestID INNER JOIN Student AS S ON TR.StudentID = S.StudentID WHERE T.TestNameJp = N'数学1' AND YEAR(S.Birthday) >= 1980;
[ 実行結果 ]
テスト名が 「 数学1 」 は TestID が 1、1980 年以降に生まれた学生は StudentID が、1,4,6 なので、TestResultID が 1,3 の行のスコアが 1 点ずつ追加されましたね。
次は、DELETE と JOIN を使って、テーブルのデータを削除してみましょう。