MySQLでINSERTやUPDATEなしに平均スコアを自動表示する方法:生成カラム(GENERATED COLUMN)の活用術
MySQLでは、テーブルに「計算カラム(生成カラム)」を追加することで、INSERTやUPDATEを行わなくても、クエリ実行時に自動的に計算された値を表示できます。本記事では、複数のカラムの値から「平均スコア」を自動的に算出して表示する方法を、具体例とともにわかりやすく解説します。
基本構文
既存のテーブルに生成カラムを追加するには、ALTER TABLE文とGENERATED ALWAYS AS ... VIRTUAL句を使用します。基本的な構文は以下のとおりです。
ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型 GENERATED ALWAYS AS ((カラム名1 + カラム名2 + ... + カラム名N) / N) VIRTUAL;
サンプルテーブルの作成
まず、動作確認用のテーブルを作成しましょう。ここでは2つの整数カラムを持つシンプルなテーブルを定義します。
mysql> CREATE TABLE demo32 -> ( -> value1 int, -> value2 int -> ); Query OK, 0 rows affected (1.42 sec)
テストデータの挿入
INSERTコマンドを使って、いくつかのレコードを追加します。
mysql> INSERT INTO demo32 VALUES(30,60); Query OK, 1 row affected (0.16 sec) mysql> INSERT INTO demo32 VALUES(20,40); Query OK, 1 row affected (0.15 sec) mysql> INSERT INTO demo32 VALUES(35,35); Query OK, 1 row affected (0.08 sec)
SELECT文で現在のデータを確認してみましょう。
mysql> SELECT * FROM demo32;
実行結果は以下のとおりです。
+--------+--------+ | value1 | value2 | +--------+--------+ | 30 | 60 | | 20 | 40 | | 35 | 35 | +--------+--------+ 3 rows in set (0.00 sec)
平均スコアを表示する生成カラムの追加
それでは本題です。value1とvalue2の平均値を自動的に計算して表示する「Average Score」カラムを追加します。INSERTやUPDATEは一切不要で、SELECT時に常に最新の平均が算出される仕組みです。
mysql> ALTER TABLE demo32 ADD COLUMN `Average Score` float -> GENERATED ALWAYS AS ((value1 + value2) / 2) VIRTUAL; Query OK, 0 rows affected (1.57 sec) Records: 0 Duplicates: 0 Warnings: 0
再度SELECT文で全レコードを取得すると、新しく追加されたカラムも一緒に表示されます。
mysql> SELECT * FROM demo32;
実行結果を見ると、「Average Score」カラムには各行の平均値が自動的に計算されて表示されていることがわかります。
+--------+--------+---------------+ | value1 | value2 | Average Score | +--------+--------+---------------+ | 30 | 60 | 45 | | 20 | 40 | 30 | | 35 | 35 | 35 | +--------+--------+---------------+ 3 rows in set (0.00 sec)
ポイント解説:VIRTUALとSTOREDの違い
生成カラムには「VIRTUAL」と「STORED」の2種類があります。
- VIRTUAL(仮想): 値をディスクに保存せず、読み取り時に毎回計算します。ストレージ容量を節約でき、今回の例のように動的な計算結果を得たい場合に最適です。
- STORED(格納): 計算結果を物理的に保存します。読み取り速度は速くなりますが、参照元のカラムが更新されるたびに再計算・保存が行われます。
デフォルトはVIRTUALであるため、上記の例のように明示的に指定しなくても仮想カラムとして動作します。また、生成カラムにはインデックスを作成できるため、頻繁に検索条件として使う場合にも有効です。集計値をリアルタイムに反映したいシーンで、ぜひこの手法を活用してみてください。
-
【MySQL】CREATE TABLE ... LIKEで既存テーブルと同じ構造の新しいテーブルを作成する方法
MySQLでは、CREATE TABLE ... LIKE構文を使用することで、既存のテーブルと同じ構造(カラム定義、PRIMARY KEY、AUTO_INCREMENT属性など)を持つ新しいテーブルを簡単に作成できます。ここでは、実際の手順を順番に解説します。 ステップ1:元となるテーブルを作成する まず、コピー元となるテーブルを作成します。 mysql> create table DemoTable1 ( EmployeeId int NOT NULL AUTO_INCREMENT PRIMARY KEY, &
-
MySQLでテーブルの日付レコードを変更する方法|UPDATEとDATE_ADD()の使い方
MySQLで保存済みの日付データに年数を加算して変更したい場合、UPDATEコマンドとDATE_ADD()関数を組み合わせることで簡単に実現できます。ここでは、実際のSQLクエリ例を使いながら、日付レコードを変更する手順を順番に解説します。1. テーブルを作成するまず、日付型(date)のカラムを持つテーブルを作成します。mysql> create table DemoTable1984 ( ShippingDate date ); Query OK, 0 rows affected (0.00 sec)2. レコードを挿入する次に、INSERTコマンドを使ってテ