前回の続きです。
enum 複数の文字列から一つだけ格納する
カラム作成時に、'カラム名' enum('文字列1' , '文字列2' , '文字列3')とすると
レコード作成時にenumで宣言した値でのみ格納できるようになる。
宣言した値は文字列だけでなく連番で管理される。
create table users (
id int unsigned primary key auto_increment,
name varchar(20),
score float,
rank enum('gold','silver','bronze')
);
insert into users (name, score,rank) values ('taguchi', 5.8,'gold');
insert into users (name, score,rank) values ('fkoji', 8.2,'silver');
insert into users (name, score,rank) values ('dotinstall', 6.1,'bronze');
set 複数の文字列から複数格納する
カラム作成時に、'カラム名' enum('文字列1' , '文字列2' , '文字列3')とすると
レコード作成時にenumで宣言した値でのみ格納できるようになる。
宣言した値を複数選択可能。
宣言した値は文字列だけでなく連番で管理される。(最初の値には 2 の 0 乗の 1 、次が 2 の 1 乗の 2 、次が 2 の 2 乗の 4 、といった具合で値を保持)
drop table if exists users;
create table users (
id int unsigned primary key auto_increment,
name varchar(20),
score float,
coins set('gold','silver','bronze')
);
insert into users (name, score, coins) values ('taguchi', 5.8, 'gold,silver');
insert into users (name, score, coins) values ('fkoji', 8.2, 'silver,bronze');
insert into users (name, score, coins) values ('dotinstall', 6.1,'bronze,gold');
if と case 条件分岐でデータを抽出する
if 使い方例)
データ抽出時にselectでifを使用することで条件に応じたカラムを生成し抽出できる。
create table users (
id int unsigned primary key auto_increment,
name varchar(20),
score float
);
insert into users (name, score) values ('taguchi', 5.8);
insert into users (name, score) values ('fkoji', 8.2);
insert into users (name, score) values ('dotinstall', 6.1);
insert into users (name, score) values ('Tanaka', 4.2);
select
name,
score,
if (score > 5.0, 'OK', 'NG') as result
from
users;
>実行結果
+------------+-------+--------+
| name | score | result |
+------------+-------+--------+
| taguchi | 5.8 | OK |
| fkoji | 8.2 | OK |
| dotinstall | 6.1 | OK |
| Tanaka | 4.2 | NG |
+------------+-------+--------+
case 使い方例)
データ抽出時にselectでcaseを使用することで条件に応じたカラムを生成し抽出できる。
whenの後に直接条件を書くことができる。
create table users (
id int unsigned primary key auto_increment,
name varchar(20),
score float
);
insert into users (name, score) values ('taguchi', 5.8);
insert into users (name, score) values ('fkoji', 8.2);
insert into users (name, score) values ('dotinstall', 6.1);
insert into users (name, score) values ('Tanaka', 4.2);
select
name,
score,
case floor(score) % 2
when 0 then 'even'
when 1 then 'odd'
else null
end as type
from
users;
>実行結果
+------------+-------+------+
| name | score | type |
+------------+-------+------+
| taguchi | 5.8 | odd |
| fkoji | 8.2 | even |
| dotinstall | 6.1 | even |
| Tanaka | 4.2 | even |
+------------+-------+------+
抽出結果をテーブルにする
select fromでデータ抽出を行う分の前にcreate tableを使用することで、条件指定で抽出したカラムを含む新たなテーブルを作成できる。
create table users (
id int unsigned primary key auto_increment,
name varchar(20),
score float
);
insert into users (name, score) values ('taguchi', 5.8);
insert into users (name, score) values ('fkoji', 8.2);
insert into users (name, score) values ('dotinstall', 6.1);
insert into users (name, score) values ('Tanaka', 4.2);
create table '作成するテーブル名'
select
id,
name,
score,
case
when score > 8 then 'teamA'
when score > 6 then 'teamB'
else 'teamC'
end as team
from
users;
select * from users_with_team;
>結果
+----+------------+-------+-------+
| id | name | score | team |
+----+------------+-------+-------+
| 1 | taguchi | 5.8 | teamC |
| 2 | fkoji | 8.2 | teamA |
| 3 | dotinstall | 6.1 | teamB |
| 4 | Tanaka | 4.2 | teamC |
+----+------------+-------+-------+