目次
SQLのUPDATE文とは?
SQLはリレーショナルデータベースを操作する時に使用する言語です。SQLには四大命令文のSELECT、INSERT、UPDATE、DELETEがあります。データベースはOracle、SQL Server、MySQLなど様々な製品がありますが、SQLの基本文法はどれも同じです。
データベースに対してSELECT文は選択、INSERT文は追加、DELETE文は削除を行い、今回説明するUPDATE文は更新ができます。UPDATE文が更新するデータベースの対象はテーブルと言われ、複数のカラム(列)を持つレコード(行)の構造になっています。
サンプルのテーブル
以下のような「Test」という名前のテーブルがあるとします。id・name・age・statusがカラムで、3件のレコードがあります。
id name age status
1 山田太郎 30 教師
2 鈴木花子 17 高校生
3 佐藤一郎 9 中学生
このテーブルをSQLで更新しましょう。UPDATE文の基本文法は以下のようになります。
UPDATE テーブル名 SET カラム名=値
UPDATE SETだけだと全てのカラムが更新される
では実際にUPDATE文を実行してみましょう。
UPDATE Test SET age=10
実行すると、テーブルは以下のようになります。ageのカラムが全て10に更新されます。なおテーブルの内容を全て表示するSQL文は「SELECT * FROM Test」です。
id name age status
1 山田太郎 10 教師
2 鈴木花子 10 高校生
3 佐藤一郎 10 中学生
UPDATEとSETだけの場合、全てのレコードが更新されます。しかし実際には特定のレコードだけ更新したいことが多いでしょう。それにはどうしたらよいのでしょうか。
WHERE節で1つのレコードだけ更新できる
特定のレコードだけを更新する場合、以下のようにUPDATE文にWHERE節の条件文を追加します。
UPDATE テーブル名 SET カラム名=値 WHERE カラム名=値
それでは以下を実行します。
UPDATE Test SET age=15 WHERE name=’鈴木花子’
これで以下のようにnameが鈴木花子のレコードだけが更新されました。
id name age status
1 山田太郎 30 教師
2 鈴木花子 15 高校生
3 佐藤一郎 9 中学生
なお=を!=にすると等しくないという意味になります。以下を実行すると、
UPDATE Test SET age=15 WHERE name!=’鈴木花子’;
以下のようになります。nameが鈴木花子以外のレコードが更新されました。
id name age status
1 山田太郎 15 教師
2 鈴木花子 17 高校生
3 佐藤一郎 15 中学生
ANDとOR
WHERE節にはANDを使うことができます。AでかつBという意味です。以下を実行すると、
UPDATE Test SET age = 3 WHERE id=2 AND age=17
以下のようになります。
1 山田太郎 30 教師
2 鈴木花子 3 高校生
3 佐藤一郎 9 中学生
ORも使用できます。ORはまたはという意味です。以下を実行すると、
UPDATE Test SET age = 3 WHERE id=1 OR age=17
以下のようになります。2件のレコードが更新されていますね。
id name age status
1 山田太郎 3 教師
2 鈴木花子 3 高校生
3 佐藤一郎 9 中学生
BETWEEN ANDは範囲指定が可能
BETWEEN ANDを使うと、範囲指定ができます。以下を実行すると、
UPDATE Test SET status=’十代の若者’ WHERE age BETWEEN 10 AND 19;
以下のようになります。指定する2つの数字は~以上~以下で、その値も含むことに注意してください。
id name age status
1 山田太郎 30 教師
2 鈴木花子 17 十代の若者
3 佐藤一郎 9 中学生
INはリスト指定が可能
INを使うと指定したリストにマッチするレコードを対象にできます。以下のようにすると、
UPDATE Test SET status=’十代の奇数年齢’ WHERE age IN(11,13,15,17,19);
以下のようになります。条件の合う真ん中のレコードだけが更新されています。
1 山田太郎 30 教師
2 鈴木花子 17 十代の奇数年齢
3 佐藤一郎 9 中学生
LIKEで文字列マッチングが可能
LIKEを使うと文字列のマッチングができます。以下のようにすると、
UPDATE Test SET status=’花を含む’ WHERE name LIKE ‘%花%’;
以下のようにnameに’花’が含まれるレコードが更新されます。
id name age status
1 山田太郎 30 教師
2 鈴木花子 17 花を含む
3 佐藤一郎 9 中学生
以下のようにすると、
UPDATE Test SET status=’名字が〇田で名前が2文字’ WHERE name LIKE ‘_田__’;
以下のようになります。
id name age status
1 山田太郎 30 名字が〇田で名前が2文字
2 鈴木花子 17 高校生
3 佐藤一郎 9 中学生
LIKEで%は0文字以上の連続する文字列、_は任意の1文字という意味です。わかりにくいかもしれませんが、色々と試せば理解できるでしょう。
SETは2つ以上の更新内容を記述できる
なおUPDATE文のSETは,で区切って2つ以上の更新内容を記述することができます。以下のようにすれば、
UPDATE Test SET age=6,status=’小学生’ WHERE name=’鈴木花子’
以下のように2か所が更新されます。
id name age status
1 山田太郎 30 教師
2 鈴木花子 6 小学生
3 佐藤一郎 9 中学生
計算式を使うことも可能
SQLのUPDATE文は計算式を使うこともできます。以下を実行すると、
UPDATE Test SET age = age + 5
以下のようになります。全てのageに5が加算されます。なお計算式の場合の=は「等しい」という意味ではなく、「右辺を左辺に代入する」という意味で使われているので注意してください。
id name age status
1 山田太郎 35 教師
2 鈴木花子 22 高校生
3 佐藤一郎 14 中学生
CASE節も使える
SQLにはCASE節という条件分岐ができる構文があります。UPDATE文にもこれを使用できます。CASE文は以下のように記述します。
UPDATE テーブル名 SET カラム名 = WHEN CASE 条件 THEN 条件が成り立つ時の処理 ELSE 条件が成り立たない時の処理 END
今回のサンプルのテーブルに対して以下を実行してみましょう。ageが10を超える場合は2倍、そうでなければ5を引きます。
UPDATE Test SET age = CASE WHEN age > 10 THEN age*2 ELSE age-5 END
結果は以下のようになります。
id name age status
1 山田太郎 60 教師
2 鈴木花子 34 高校生
3 佐藤一郎 4 中学生
ORDER BYとLIMITを活用する
SQLのUPDATE文でORDER BYとLIMITを使うと便利な時があります。以下はIDを昇順に評価して、上位2件までを更新します。
UPDATE Test SET age = 50 ORDER BY id LIMIT 2
結果は以下になります。idが1と2のレコードが対象になっています。
id name age status
1 山田太郎 50 教師
2 鈴木花子 50 高校生
3 佐藤一郎 9 中学生
以下のようにDESCを使うと降順で評価されます。
UPDATE Test SET age = 50 ORDER BY id DESC LIMIT 2
今度はidが2と3のレコードが対象になっています。
id name age status
1 山田太郎 30 教師
2 鈴木花子 50 高校生
3 佐藤一郎 50 中学生
SQLのUPDATE文は更新をするための命令文
SQLのUPDATE文について解説しましたが、ご理解頂けましたでしょうか。
SQLの4大命令はデータベースエンジニアにとって基本の必須知識なので、しっかりマスターしてSQLを使いこなしましょう。
インフラエンジニア専門の転職サイト「FEnetインフラ」
FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。
転職をお考えの方は気軽にご登録・ご相談ください。