MySQLのENUM型(列挙型)の値を式で使う方法とインデックス番号の仕組み
MySQLのENUM型(列挙型)の値は、内部的にインデックス番号と関連付けられています。そのため、ENUM型の値を式の中で使用すると、計算は文字列そのものではなく、対応するインデックス番号に対して行われます。
ENUM値とインデックス番号の関係
ENUM型では、定義時に列挙した値に先頭から1、2、3…というインデックス番号が割り当てられます。空文字列('')は0、NULLはNULLとして扱われる点に注意が必要です。
以下の例では、Gradeカラムが ENUM('POOR','GOOD') として定義されているテーブルを使用します。この場合、「POOR」はインデックス1、「GOOD」はインデックス2に対応します。
mysql> Select * from Result; +-----+--------+-------+ | Id | Name | Grade | +-----+--------+-------+ | 100 | Gaurav | GOOD | | 101 | Rahul | POOR | | 102 | Rahul | NULL | | 103 | Mohan | | +-----+--------+-------+ 4 rows in set (0.00 sec)
集計関数でのENUM値の計算例
SUM関数やAVG関数を使うと、ENUM値はインデックス番号に変換されて計算されます。
mysql> Select SUM(Grade) from result; +------------+ | SUM(Grade) | +------------+ | 3 | +------------+ 1 row in set (0.00 sec) mysql> Select AVG(Grade) from result; +------------+ | AVG(Grade) | +------------+ | 1 | +------------+ 1 row in set (0.00 sec)
SUM(Grade) の結果が3になっているのは、「GOOD」のインデックス2と「POOR」のインデックス1を合計したためです。また、AVG(Grade) は (2+1)÷2 = 1.5 となりますが、結果が整数で表示されるため1と出力されています。
算術演算でのENUM値の計算例
カラムに0を加算したり1を減算したりすると、各ENUM値に対応するインデックス番号がそのまま返されます。
mysql> Select Grade+0 from result; +---------+ | Grade+0 | +---------+ | 2 | | 1 | | NULL | | 0 | +---------+ 4 rows in set (0.00 sec) mysql> Select Grade-1 from result; +---------+ | Grade-1 | +---------+ | 1 | | 0 | | NULL | | -1 | +---------+ 4 rows in set (0.00 sec)
この結果から、以下の対応関係が確認できます。
- 「GOOD」→ インデックス番号 2
- 「POOR」→ インデックス番号 1
- NULL → NULL(計算結果もNULLになる)
- 空文字列('')→ インデックス番号 0
このように、MySQLではENUM型の値を式に組み込むと、文字列としてではなくインデックス番号として計算が行われます。ENUM値を数値演算に使う場合は、この仕組みを理解しておくことが重要です。
-
MySQLでNULL値を0に置き換える方法:IFNULL関数の使い方を解説
MySQLでクエリを実行した際にNULL値が返ってくる場合、IFNULL()関数を使うことで、NULLを別の値(ここでは0)に置き換えることができます。この記事では、実際にテーブルを作成し、NULL値を含むデータに対してIFNULL()を適用する手順を順番に解説します。サンプルテーブルの作成まず、テスト用のテーブルを作成します。Idカラムは自動採番の主キーとし、ValueカラムにはNULLを許容するように定義します。mysql> create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMAR
-
MySQLでAUTO_INCREMENTの値を1から再スタートさせる方法
MySQLでAUTO_INCREMENT(自動採番)の値を1から振り直したい場合は、TRUNCATEでテーブルを初期化するのが最も簡単な方法です。ここでは、実際にサンプルテーブルを作成し、動作を順番に確認していきましょう。サンプルテーブルの作成まず、AUTO_INCREMENT列を持つテーブルを作成します。mysql> create table DemoTable ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY ); Query OK, 0 rows affected (1.44 sec)次に、INSERTコマンドで複数のレ