MySQLで全行の値に数値や日付を加算する方法(UPDATE文の使い方)
MySQLでは、UPDATE文を使うことで、テーブル内のすべての行に対して一括で値を加算できます。対象となるカラムの型が整数型か日付型かによって、書き方が少し異なります。
整数型カラムに値を加算する構文
カラムが整数型の場合、以下のような構文を使用します。
UPDATE テーブル名 SET 整数カラム名 = 整数カラム名 + 加算する値; UPDATE テーブル名 SET 整数カラム名 = 加算する値 WHERE 整数カラム名 IS NULL;
1行目は既存の値に加算する基本形、2行目はNULLが含まれている場合にNULLを任意の値へ置き換えるためのクエリです。
日付型カラムに値を加算する構文
カラムが日付型の場合は、DATE_ADD関数(またはADDDATE関数)を使って加算します。
UPDATE テーブル名 SET 日付カラム名 = DATE_ADD(日付カラム名, INTERVAL 加算する月数 MONTH);
動作確認用テーブルの作成
それでは、実際にテーブルを作成して動きを確認してみましょう。まずはテーブル作成のクエリです。
mysql> create table addEachRowValue
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Amount int,
-> ShippingDate date,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.50 sec)
次に、INSERT文でサンプルデータを挿入します。
mysql> insert into addEachRowValue(Amount,ShippingDate) values(100,'2019-02-21'); Query OK, 1 row affected (0.15 sec) mysql> insert into addEachRowValue(Amount,ShippingDate) values(10,'2013-04-22'); Query OK, 1 row affected (0.19 sec) mysql> insert into addEachRowValue(Amount,ShippingDate) values(110,'2015-10-25'); Query OK, 1 row affected (0.15 sec) mysql> insert into addEachRowValue(Amount,ShippingDate) values(150,'2016-03-27'); Query OK, 1 row affected (0.29 sec) mysql> insert into addEachRowValue(Amount,ShippingDate) values(190,'2018-12-29'); Query OK, 1 row affected (0.20 sec)
SELECT文ですべてのレコードを表示して確認します。
mysql> select *from addEachRowValue;
実行結果は以下のとおりです。
+----+--------+--------------+ | Id | Amount | ShippingDate | +----+--------+--------------+ | 1 | 100 | 2019-02-21 | | 2 | 10 | 2013-04-22 | | 3 | 110 | 2015-10-25 | | 4 | 150 | 2016-03-27 | | 5 | 190 | 2018-12-29 | +----+--------+--------------+ 5 rows in set (0.00 sec)
整数型カラム(Amount)への加算例
ここでは、整数型のAmountカラムの全行に「20」を加算してみます。
mysql> update addEachRowValue -> set Amount=Amount+20; Query OK, 5 rows affected (0.85 sec) Rows matched: 5 Changed: 5 Warnings: 0
更新後のAmountカラムの値をSELECT文で確認しましょう。
mysql> select Amount from addEachRowValue;
実行結果は以下のとおりです。すべての行に20が加算されていることがわかります。
+--------+ | Amount | +--------+ | 120 | | 30 | | 130 | | 170 | | 210 | +--------+ 5 rows in set (0.00 sec)
日付型カラム(ShippingDate)への加算例
続いて、日付型のShippingDateカラムに対して、全行の日付に「1ヶ月」を加算します。
mysql> update addEachRowValue -> set ShippingDate=adddate(ShippingDate,interval 1 month); Query OK, 5 rows affected (0.31 sec) Rows matched: 5 Changed: 5 Warnings: 0
更新後の日付をSELECT文で確認します。
mysql> select ShippingDate from addEachRowValue;
実行結果は以下のとおりです。すべての日付が1ヶ月後になっていることが確認できます。
+--------------+ | ShippingDate | +--------------+ | 2019-03-21 | | 2013-05-22 | | 2015-11-25 | | 2016-04-27 | | 2019-01-29 | +--------------+ 5 rows in set (0.00 sec)
まとめ
MySQLで全行に値を加算する場合は、UPDATE文とSET句を組み合わせるだけで実現できます。整数型なら「カラム名 = カラム名 + 値」、日付型なら「ADDDATE関数」や「DATE_ADD関数」にINTERVALを指定するのがポイントです。WHERE句を付けなければ全行が更新対象になるため、実行前には必ずバックアップを取るか、トランザクション内で検証することをおすすめします。
-
MySQLの1つのALTER文でカラムとインデックスを同時に追加する方法
はじめにMySQLでは、既存のテーブルに新しいカラムを追加すると同時に、そのカラムにインデックスを設定したいケースはよくあります。通常、これらは2つの別々のクエリで実行するイメージがありますが、実はALTER TABLE文を使えば、たった1つのクエリでカラムの追加とインデックスの作成を同時に行うことができます。この記事では、具体的な手順を実行例とともにわかりやすく解説します。基本構文ALTER文にADD句を組み合わせて使用します。構文は以下の通りです。ALTER TABLE テーブル名ADD カラム名 DATETIME DEFAULT NOW(),ADD INDEX(カラム名);ポイントは、複
-
MySQLクエリで特定の行を検索する方法|WHERE句を使った条件指定の基本
MySQLで大量のデータが保存されたテーブルから、目的の1行だけを取り出したい場面はよくあります。そんなときに活躍するのがWHERE句です。この記事では、サンプルテーブルを作成しながら、特定の行を検索して表示する方法を初心者向けにわかりやすく解説します。 1. サンプルテーブルを作成する まず、検索対象となるテーブルを作成しましょう。ここではユーザーIDとユーザー名を持つ「DemoTable」を使用します。 mysql> create table DemoTable ( UserId int, UserName varchar(100) ); Query OK, 0 r