テーブルのレコードを更新する場合に利用するUPDATE文について、初心者向けにわかりやすく1分で解説します。
参考 SQLとは?
前提となる知識は一切必要ありません。このページ内を読めば自分ひとりでテーブルのレコード更新行うことができるようサンプルコード付きでご説明します。
プログラマーやデータベースエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識。是非最後までご覧ください。
SQL文の基本ルール(大文字/小文字の区別、コメントの付与など)を始めに学んでおきたい方は以下の記事を先にご覧ください。
SQL:UPDATE文
UPDATE文は対象テーブルのレコードを更新する場合に利用します。
例えばINSERT文でレコードを誤って登録してしまった場合にUPDATE文を利用するとその誤りを修正することが可能になります。
構文ルールは以下の通り。
-- 全レコード(全行)更新 UPDATE テーブル名 SET 列名 = 値; -- 指定レコード更新 UPDATE テーブル名 SET 列名 = 値 WHERE 条件式; --複数列更新 UPDATE テーブル名 SET 列名 = 値, 列名 = 値, 列名 = 値 WHERE 条件式;
1つひとつ順を追って解説します。
以下のようなテーブルが存在することを前提にご説明していきます。
UPDATE:全レコード更新
まずは最もシンプルなWHERE句を用いないUPDATE文から解説します。
通常、UPDATE文はWHERE句とセットで用いますがまずは理解促進のためWHERE句なしの場合のUPDATE文について解説します。
-- 全レコード(全行)更新 UPDATE テーブル名 SET 列名 = 値;
上記のようなUPDATE文を発行すると、指定したテーブルのすべてのレコードがSET句の値で更新されます。
UPDATE PointList SET Japanese = 100; /* Japanese列がすべて「100」に更新される +----+------+-------+----------+------+---------+ | ID | Name | Class | Japanese | Math | English | +----+------+-------+----------+------+---------+ | 1 | 佐藤 | A | 100 | 100 | 85 | | 2 | 鈴木 | A | 100 | 70 | 70 | | 3 | 高橋 | A | 100 | 70 | 65 | | 4 | 中村 | A | 100 | 65 | 85 | | 5 | 小林 | B | 100 | 90 | 65 | | 6 | 山口 | B | 100 | 85 | 85 | | 7 | 田中 | B | 100 | 90 | 65 | | 8 | 伊藤 | B | 100 | 90 | NULL | +----+------+-------+----------+------+---------+ */
SET句で "Japanese = 100" と記述しているのですべてのレコードのJapanaese列が100で更新されます。
これが最も基本的なUPDATE文の動作です。
ただしほとんどの場合、すべてのレコードを一度に更新するようなことはありません。基本的には更新したいレコードを指定してUPDATE文を実行します。
UPDATE:WHERE句
UPDATE文でWHERE句を用いる場合の構文ルールは以下の通り。
-- 指定レコード更新 UPDATE テーブル名 SET 列名 = 値 WHERE 条件式;
先ほどと同様、以下のようなテーブルを例に解説します。
例として、Class列が「A」のレコードのみJapanaese列を「100」にUPDATEしてみましょう。
UPDATE PointList SET JAPANESE = 100 where class ='A'; /* Class「A」のみJapanaese列がすべて「100」に更新される +----+------+-------+----------+------+---------+ | ID | Name | Class | Japanese | Math | English | +----+------+-------+----------+------+---------+ | 1 | 佐藤 | A | 100 | 100 | 85 | | 2 | 鈴木 | A | 100 | 70 | 70 | | 3 | 高橋 | A | 100 | 70 | 65 | | 4 | 中村 | A | 100 | 65 | 85 | | 5 | 小林 | B | 70 | 90 | 65 | | 6 | 山口 | B | 90 | 85 | 85 | | 7 | 田中 | B | 70 | 90 | 65 | | 8 | 伊藤 | B | 70 | 90 | NULL | +----+------+-------+----------+------+---------+
ご覧のようにWHERE句で指定した条件に合致するレコードのみUPDATEがなされました。
WHERE句を用いない場合、すべてのレコードが一気に更新されてしまうため、ここは細心の注意を払う必要があります。
ただし、これだけでは不十分です。最後に、Japanaese列だけでなく、Math列やEnglish列に対しても同様に更新をかけたいような場合についてご説明します。
UPDATE文:複数列の更新
UPDATE文で複数列(複数カラム)の更新を行いたい場合は以下のようにSET句に「,」区切りで列名を順に指定します。
--複数列更新 UPDATE テーブル名 SET 列名 = 値, 列名 = 値, 列名 = 値 WHERE 条件式;
こちらも先ほどと同じテーブルを対象に以下のようなSQL文を実行してみます。
-- Class「A」の人はすべて100点にする UPDATE PointList SET Japanese = 100, Math = 100, English = 100 WHERE Class = 'A'; /* +----+------+-------+----------+------+---------+ | ID | Name | Class | Japanese | Math | English | +----+------+-------+----------+------+---------+ | 1 | 佐藤 | A | 100 | 100 | 100 |←すべて「100」に更新 | 2 | 鈴木 | A | 100 | 100 | 100 |←すべて「100」に更新 | 3 | 高橋 | A | 100 | 100 | 100 |←すべて「100」に更新 | 4 | 中村 | A | 100 | 100 | 100 |←すべて「100」に更新 | 5 | 小林 | B | 70 | 90 | 65 | | 6 | 山口 | B | 90 | 85 | 85 | | 7 | 田中 | B | 70 | 90 | 65 | | 8 | 伊藤 | B | 70 | 90 | NULL | +----+------+-------+----------+------+---------+ */
ご覧のようにSET句で指定したJapanaese列~English列の値が一度に更新されました。
最後にUPDATE文を利用したサンプルコードを記載しておきます。以下のコードの意味を理解できれば本ページで解説した内容の定着度はOKです。
-- テーブル作成/レコード登録 CREATE TABLE employees ( id INT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50), department VARCHAR(50), salary INT ); INSERT INTO employees (id, first_name, last_name, department, salary) VALUES (1, 'John', 'Doe', 'IT', 50000), (2, 'Jane', 'Smith', 'HR', 55000), (3, 'Mike', 'Brown', 'IT', 60000), (4, 'Nancy', 'Johnson', 'HR', 52000), (5, 'Tom', 'Jones', 'IT', 57000); -- パターン1: 単一レコードの値を更新 UPDATE employees SET salary = 55000 WHERE id = 1; /* 結果 idが1の従業員の給与が55000に更新される |----|------------|-----------|------------|--------| | id | first_name | last_name | department | salary | |----|------------|-----------|------------|--------| | 1 | John | Doe | IT | 55000 | | 2 | Jane | Smith | HR | 55000 | | 3 | Mike | Brown | IT | 60000 | | 4 | Nancy | Johnson | HR | 52000 | | 5 | Tom | Jones | IT | 57000 | |----|------------|-----------|------------|--------| */ -- パターン2: 複数レコードの値を一括で更新 UPDATE employees SET salary = salary + 5000 WHERE department = 'IT'; /* 結果 IT部門の従業員全員の給与を5000増 |----|------------|-----------|------------|--------| | id | first_name | last_name | department | salary | |----|------------|-----------|------------|--------| | 1 | John | Doe | IT | 60000 | | 2 | Jane | Smith | HR | 55000 | | 3 | Mike | Brown | IT | 65000 | | 4 | Nancy | Johnson | HR | 52000 | | 5 | Tom | Jones | IT | 62000 | |----|------------|-----------|------------|--------| */ -- パターン3: 複数のカラムを一度に更新 UPDATE employees SET last_name = 'White', salary = 60000 WHERE id = 2; /* 結果 idが2の従業員の姓を'White'に変更し給与を60000に更新 |----|------------|-----------|------------|--------| | id | first_name | last_name | department | salary | |----|------------|-----------|------------|--------| | 1 | John | Doe | IT | 60000 | | 2 | Jane | White | HR | 60000 | | 3 | Mike | Brown | IT | 65000 | | 4 | Nancy | Johnson | HR | 52000 | | 5 | Tom | Jones | IT | 62000 | |----|------------|-----------|------------|--------| */ -- パターン4: 更新条件にサブクエリを利用 UPDATE employees SET salary = salary * 1.1 WHERE salary < (SELECT AVG(salary) FROM employees); /* 給与が平均給与より低い従業員の給与を10%増やす(この例ではNancy Johnsonが該当) |----|------------|-----------|------------|--------| | id | first_name | last_name | department | salary | |----|------------|-----------|------------|--------| | 1 | John | Doe | IT | 60000 | | 2 | Jane | White | HR | 60000 | | 3 | Mike | Brown | IT | 65000 | | 4 | Nancy | Johnson | HR | 57200 | (52000 * 1.1) | 5 | Tom | Jones | IT | 62000 | |----|------------|-----------|------------|--------| */
参考 スカラ・サブクエリ
SQLを1から学習したい方は
SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。
SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?
とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。
システムエンジニアを目指したい方は
システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。
正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。
システムエンジニア向けに「できるエンジニア」になる方法を1から解説しておりますので、是非ご覧ください。