MySQLの基本(データベースの操作)2 

前回の続きです。

<h2>enum　複数の文字列から一つだけ格納する</h2>


カラム作成時に、'カラム名' enum（'文字列１' , '文字列２' , '文字列３'）とすると
レコード作成時に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');
```

<h2>set　複数の文字列から複数格納する</h2>

カラム作成時に、'カラム名' enum（'文字列１' , '文字列２' , '文字列３'）とすると
レコード作成時に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');
```

<h2>if と case 　条件分岐でデータを抽出する</h2>

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 |
+------------+-------+------+
```

<h2>抽出結果をテーブルにする</h2>

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 |
+----+------------+-------+-------+

```