トップ > SQL入門 > 22章
22章 データ更新
では、次はデータの更新方法を確認していきましょう。

データの変更は既存のデータに対する変更を行います。
1つの列を更新するだけでなく、複数の列を同時に変更することも可能です。

では基本構文です。

[構文] 行の更新
 UPDATE 表名
 SET 列名 = 値 [ ,列名 = 値 …]
 [WHERE 条件式];

SET句には更新したい列名と値を指定します。
WHERE句を使用して特定の行のみ更新することができます。

WHERE句を指定しなかった場合は、すべてのレコードが更新対象となります。
また複数の列を同時に更新した場合は、カンマを指定し、
列名を追加することで複数列を更新することができます。

では実行例を見ていきましょう。

  SQL> SELECT emp_id,first_name,tel
    2  FROM employees WHERE emp_id = 15;

      EMP_ID FIRST_NAME       TEL
  ---------- ---------------- ------------
          15 Kato             03-XXXX-XXXX

  SQL> UPDATE employees 
    2  SET TEL = '03-AAAA-BBBB' 
    3  WHERE emp_id = 15;

  1 row updated.

  SQL> SELECT emp_id,first_name,tel 
    2> FROM employees WHERE emp_id = 15;

      EMP_ID FIRST_NAME       TEL
  ---------- ---------------- ------------
          15 Kato             03-AAAA-BBBB
          

WHERE句を指定し、emp_idが15のTELの値を変更しました。
また、NULLに変換する場合は、以下のコマンドで変更できます。

  SQL> UPDATE employees
    2  SET TEL = NULL
    3  WHERE emp_id = 15;

  1 row updated.
  

次に平均給与を給与の値に適用したい場合はどうでしょうか。

  SQL> UPDATE employees SET salary = AVG(salry) 
    2> WHERE emp_id = 15;
                                     *
  ERROR at line 1:
  ORA-00934: group function is not allowed here
  

上記のコマンドではエラーとなってしまいました。
関数を使用したい場合は直接、値を指定することは出来ません。
この時は副問合せを使用します。

  SQL> UPDATE employees
    2  SET salary = (SELECT AVG(salary) FROM employees)
    3  WHERE emp_id = 15;

  1 row updated.
  

今度はエラーなく更新が行えました。このように関数を使用する場合は副問合せを使用します。

では次に複数列の更新の場合も確認していきましょう。

  SQL> SELECT emp_id,first_name,tel,address
    2  FROM employees WHERE emp_id = 15;

      EMP_ID FIRST_NAME         TEL          ADDRESS
  ---------- ------------------ ------------ ------------------
          15 Kato               03-XXXX-XXX  AA-X3XW-SEF


  SQL> UPDATE employees
    2  SET TEL = '03-AAAA-BBBB' , ADDRESS = 'SAITAMA'
    3  WHERE emp_id = 15;

  1 row updated.

  SQL> SELECT emp_id,first_name,tel,address FROM employees 
    2  WHERE emp_id = 15;

      EMP_ID FIRST_NAME         TEL          ADDRESS
  ---------- ------------------ ------------ ------------------
          15 Kato               03-AAAA-BBBB  SAITAMA
          

次に平均給与よりも少ない従業員の給与を550万に変更する方法を考えてみましょう。
まず、平均給与が分からないので、平均給与を求める必要があります。
平均を求める関数はAVGですね。

では、実行例を確認していきましょう。

  SQL> SELECT emp_id,first_name,salary FROM employees
    2  WHERE salary < ( SELECT AVG(salary) FROM employees);

      EMP_ID FIRST_NAME                         SALARY
  ---------- ------------------------------ ----------
           3 Yamamoto                          5000000
           5 Watanabe                          5500000
          11 Sato                              5400000
          12 Tao                               5400000
          13 Kaneko                            5400000
          14 Totsuka                           5400000
          17 Kuroda                            4000000
          18 Nakamura                          4000000
          19 Kamata                            4000000

  9 rows selected.

  SQL> UPDATE employees SET salary = 5500000
    2  WHERE salary < ( SELECT AVG(salary) FROM employees);

  9 rows updated.
  

今回はWHERE句に副問合せを使用し、
そのSELECTでは平均給与を求めるSELECT文を指定しました。

結果、平均給与より少ない従業員に対し、
給与を550万円に変更することができるようになりました。

以上がUPDATEによるデータ変更についてでした。