0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-09-08

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);

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

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

image.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

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

データ投入
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

ほかにも、レベル毎の最大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

終わり

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

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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?