【SQL Server】VIEWって便利だなァ～

# VIEWについて
複雑なSQLでデータ抽出を行っている場合に、スペルを間違えたり、そもそも構文が違ったりして手間が掛かる可能性があります。
上記SQLに関して、使用頻度が高い場合はVIEWを作成する事で楽が出来るかもしれません。
VIEWはテーブルから必要な情報を取得した仮想的な表です。

## 実際に作ってみる

やってみると理解が深まるので、実際やります。
さっそく、テーブル作ります。データも投入と、、

```:テストデータ
CREATE TABLE VANILLA(

	code INT PRIMARY KEY,
	name VARCHAR(40) NOT NULL,
	level INT NOT NULL,
	attribute VARCHAR(10) NOT NULL,
 	type VARCHAR(10) NOT NULL,
	attack INT NOT NULL,
	defense INT NOT NULL,
);	

INSERT INTO VANILLA (code,name,level,attribute,type,attack,defense) VALUES (1,'ウィング・エッグ・エルフ',3,'光','天使族',500,1300);
INSERT INTO VANILLA (code,name,level,attribute,type,attack,defense) VALUES (2,'カース・オブ・ドラゴン',5,'闇','ドラゴン族',2000,1500);
INSERT INTO VANILLA (code,name,level,attribute,type,attack,defense) VALUES (3,'岩石の巨兵',3,'地','岩石族',1300,2000);
INSERT INTO VANILLA (code,name,level,attribute,type,attack,defense) VALUES (4,'クレイジー・フィッシュ',4,'水','魚族',1600,1200);
INSERT INTO VANILLA (code,name,level,attribute,type,attack,defense) VALUES (5,'ケンタウロス',4,'地','獣族',1300,1550);
INSERT INTO VANILLA (code,name,level,attribute,type,attack,defense) VALUES (6,'ゴキボール',4,'地','昆虫族',1200,1400);
INSERT INTO VANILLA (code,name,level,attribute,type,attack,defense) VALUES (7,'サイクロプス',4,'地','獣戦士族',1200,1000);
INSERT INTO VANILLA (code,name,level,attribute,type,attack,defense) VALUES (8,'シルバー・フォング',3,'地','獣族',1200,800);
INSERT INTO VANILLA (code,name,level,attribute,type,attack,defense) VALUES (9,'地を這うドラゴン',5,'地','ドラゴン族',1600,1400);
```

この中で、レベル４以下 and 攻撃力が平均値以上　のデータを抽出します。
別に複雑でもなんでもないですが、とりあえずやってみます。
以下のようなデータが取得出来ました。

```:SELECT文
SELECT * FROM VANILLA WHERE level <= 4 and attack >= (SELECT AVG(attack) FROM VANILLA);
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/edb6910e-45bc-b8bf-2d22-d0591c456952.png)

上記のSELECT文でVIEWを作成します。
構文は、`CREATE VIEW ビュー名 AS SELECT カラム名 from テーブル名`となります。
確認する際は、`SELECT カラム名 FROM ビュー名`で確認できます。

```:VIEW作成
CREATE VIEW lower_monster AS SELECT * FROM VANILLA WHERE level <= 4 and attack >= (SELECT AVG(attack) FROM VANILLA);
```
```:VIEW確認
SELECT * FROM lower_monster
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/edb6910e-45bc-b8bf-2d22-d0591c456952.png)

ちゃんと作成されてますね。
試しに、元となったテーブルにデータを投入してみます。

```:データ投入
INSERT INTO VANILLA (code,name,level,attribute,type,attack,defense) 
	VALUES (10,'デーモンの召喚',6,'闇','悪魔族',2500,1200),
		   (11,'砦を守る翼竜',4,'風','ドラゴン族',1400,1200),
		   (12,'ハーピィ・レディ',4,'風','鳥獣族',1300,1400),
		   (13,'マンモスの墓場',3,'地','恐竜族',1200,800),
		   (14,'モリンフェン',5,'闇','悪魔族',1550,1300),
		   (15,'ルイーズ',4,'地','獣戦士族',1200,1500),
		   (16,'真紅眼の黒竜',7,'闇','ドラゴン族',2400,2000),
		   (17,'闇・道化師のサギー',3,'闇','魔法使い族',600,1500),
		   (18,'プチテンシ',3,'光','天使族',600,900),
		   (19,'暗黒騎士ガイア',7,'地','戦士族',2300,2100),
           (20,'ヂェミナイ・エルフ',4,'地','魔法使い族',1900,900);
```

VIEWにも反映されているかを確認します。

```:VIEW確認
SELECT * FROM lower_monster
```

ヂェミナイエルフさんが増えました。
これは、便利ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/586b2bab-0155-3c5d-a281-0a5a98a8ddbd.png)

ほかにも、レベル毎の最大attack値を確認出来るVIEWを作成してみます。
あんまり業務でSQL弄らないから、楽しいですな。

```:VIEW作成&確認
CREATE VIEW max_attack AS SELECT level,MAX(attack) as max_attack FROM vanilla GROUP BY level;

SELECT * FROM max_attack;
```

ちゃんと想定した通り作成されました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/3ff59670-107b-5689-9d28-0003dd4444a1.png)

## 終わり
VIEWは会話に出てきますが、実際に自分で作成した事はなかったので、知識として知れて良かったです。
普段の業務では、まず作らないだろうな、、というのが凄く残念です、、。

腐らずに勉強して、仕事がきたら対応できるようにします！
もう少しDB回りの知識を身に着けねば～