4.1 UPDATE SET ステートメント

テーブル内の既存のレコードを変更する必要がある場合は、演算子を使用しますUPDATE

一方では、列に新しい値を指定する必要があるため、演算子UPDATEは 演算子 に似ています。INSERT一方、演算子ではSELECT、データ グループをすぐに操作できるためです。

重要!演算子の目的は、UPDATEテーブルの 1 行のデータではなく、特定の条件を満たすすべての行のデータを変更することです。また、小さな間違いを犯すと、テーブル内のすべてのデータが簡単に失われる可能性があります。

リクエストの全体像:

UPDATE table SET
  	column 1 = expression 1,
  	column 2 = expression 2,
  	column 3 = expression 3
WHERE condition;

すべての従業員の給与を 100 増やすクエリを作成してみましょう。クエリは次のようになります。

UPDATE employee SET
  	salary = salary+100;

そして今度は、給与が 50,000 未満のすべての人に対して、給与を 20% 引き上げます。リクエスト例:

UPDATE employee SET
  	salary = salary*1.2
WHERE salary<50000;

そしてもちろん、ディレクターの給与を2倍に引き上げます。彼なしではどうなるでしょうか。

UPDATE employee SET
  	salary = salary*2
WHERE id=4;

4.2 複雑なデータ変更シナリオ

複数のテーブルのデータを同時に変更する場合、または 1 つのテーブルのデータを変更する場合は、そのテーブルに別のテーブルのデータを入力するか、最初のテーブルを変更する過程で何らかの方法で別のテーブルのデータを使用する必要があります。その後、驚きが私たちを待っています。

従業員テーブルに存在するユーザー テーブル内のすべてのユーザーのレベルを変更してみます。簡単にするために、ユーザーの一致を名前で確認します。

このクエリはどのように書きますか?

UPDATE user SET
  	level = 80,
WHERE user . name IN ( list of names from employee table );

さて、従業員テーブルの名前のリストをこのクエリに追加しましょう。

UPDATE user SET
  	level = 80,
WHERE user.name IN (select name from employee);

面白い!名前を取得するための SQL クエリ自体は、タスクの説明よりもさらに短いことが判明しました。SQL の作成者は無駄にパンを食べたわけではありません。

あなたを動揺させることを強いられた -このアプローチは機能しません。まず、これらのテーブルを結合する必要があります。テーブルは次のようになります。

UPDATE table 1, table 2 SET
  	column 1 = expression 1,
  	column 2 = expression 2,
  	column 3 = expression 3
WHERE table 1.id = table 2.ref_id;

もう少し難しくしてみましょう。給与が 50,000 を超える優秀な従業員に対してのみ、レベルを 80 に設定する必要があります。完全なソリューションは次のようになります。

UPDATE user, good_employees SET
  	user.level = 80
WHERE user.name = good_employees.name;

このようなテーブルの結合は実際には であるINNER JOINため、最終的には 2 番目のテーブルに名前が一致するユーザーだけが残ります。

ただし、何らかの方法で優秀な従業員を選択する必要があるため、さらにコードを追加しましょう。

SELECT * FROM employee WHERE salary >= 50000

そして、このテーブルを最後のクエリに置き換えます。

UPDATE user,
    (SELECT * FROM employee WHERE salary >= 50000) good_emps
SET
    user.level = 80
WHERE user.name = good_emps.name;

今はそれとともに生きてください。