00メニュー > 01はじめてのMySQL > 02MySQLの基礎知識 > 03MySQLを使いこなす > 04MySQL+PHPの基礎 > 05MySQL+PHPの実践 > 06Appendix

11ビューを使いこなす(備忘録)→ > 01p > 02p > 03p > 04p > 05p > END

11 ビューを使いこなす

  単純にINSERT、SELECT、DELETEするだけでデータベースが運用できるわけではありません。実践では複雑に絡み合った複数のテーブルを使って大量のデータを扱い、処理の効率を考え、そして不慮のデータ消滅も許されません。MySQLの勉強も佳境を迎えています。条件を設定した抽出、編集から、リレーショナルの名にふさわしい複数のテーブルの利用。そして「ビュー」「ストアドプロシージャ」「トランザクション」「ファイル操作」という、より実践的で必要とされる内容を解説します。
☆CHAPTER08⇒いろんな条件で抽出する
☆CHAPTER09⇒テーブルを編集する
☆CHAPTER10⇒複数のテーブルを利用する
★CHAPTER11⇒ビューを使いこなす
☆CHAPTER12⇒ストアドプロシージャを使いこなす
☆CHAPTER13⇒トランザクションを使いこなす
☆CHAPTER14⇒ファイルを使ったやり取り

★CHAPTER11⇒ビューを使いこなす(p232)★

  「ビュー」は、とても便利な機能です。大切なデータをさらけ出すことなく、好きなテーブルの好きなカラムだけ、好きな条件で集めることができる。

(1)ビューとは何か

(1-1)利用可能なバージョンp232

MySQLのバージョン 5.0以降に対応しています。

(1-2)ビューの正体

ここでは、「SELECT」を使った、いろいろな抽出方法を勉強してきました。 このSELECTした結果を、あたかもテーブルのように残しておくことがビューなのです。 ビューは、テーブルではありません。ですからビューには、レコードやカラムにあるデータそのものは存在しません。ビューはつまり、「○○テーブルの××カラムと~~を△△の条件で集める」というような、データを取り出すための情報なのです。

(1-3)ビューの使い道

「テーブルのように見えるけど、実体がなく、データを集める情報だけ」というビューの便利なところは、ユーザーが「好きなテーブル」の「好きなカラムだけ」「好きな条件で」データを集められることです。 ※ここまでやってきたように、条件を設定してテーブルからデータを抽出するのは大変な作業です。でも、同じ抽出を一度ビューで実行しておけば、ユーザーの「お好みの形式をしたテーブル」として利用できるのです。 ※ユーザーから見れば、ビューとテーブルの使い勝手に差はありません。テーブルと同様に、「SELECT」も「UPDATE」もできます。ビューの値を更新すれば、リンクしている元のテーブルも更新されます。 また、よく「更新されては困る重要なデータ」があります。こんなとき、管理者など特別な人だけがそのテーブルを操作するようにします。そして、他の一般の人は触っても問題ない部分だけを集めてビューを用意しておけば安全です。 さらに、難解なテーブルの代わりに、データベース上級者が入門者にわかりやすいビューを提供してあげる、という使い方も出来るでしょう。
【図11-1 ビュー省略】

(2)ビュー利用する

(2-1)ビューを作成する

さっそく、ビューを作ってみましょう。とはいっても実体がないので、「作る」というよりも「定義する」といった方が正確なのですが。

書式⇒ビューの作成

CREATE VIEW ビューの名前 AS SELECT カラム名 FROM テーブル名 WHERE 条件

※「SELECTしたものを、CREATE VIEW(ビュー)する」という構文です。「SELECT」の前にASを付けることを忘れないでください。
例によって「WHERE 条件」と書きましたが「ORDER BY」でも「LIMIT」でも「JOIN」でも、何を使ってもかまいません。とにかく、何かの条件でカラムを集めて、仮想的なテーブルを作ります。ここでやった多くの「SELECT」の結果の「CREATE VIEW~AS」でビューにする、といったイメージです。
※では、簡単な例を1つ作ってみよう。 社員情報テーブル「tb1」は社員番号「bang」、氏名「nama」、年齢「tosi」の3つのカラムで構成されていました。 ここでは社員番号などで氏名と年齢の2つだけからできるビュー「V1」を作成してみよう。
社員情報テーブル「tb1」と同じ内容の「tb1L」を使います。あらかじめテーブル「tb1」をコピーして、テーブル「tb1L」を作成しておいてください。
※具体的には、テーブル「tb1」と同じ内容のテーブル「tb1L」の、氏名(nama)と年齢(tosi)だけで構成するビュー「V1」を作ります。さらにビュー「V1」の内容を表示します。

●実行される内容 p234

【画像】

●操作手順

①次を実行する
CREATE VIEW V1
AS
SELECT nama,tosi
FROM tb1L;
②次を実行する
SELECT * FROM V1;

□【実行結果】

mysql> CREATE TABLE tb1L SELECT * FROM tb1;
Query OK, 5 rows affected (0.20 sec)
Records: 5 Duplicates: 0 Warnings: 0

mysql> select * from tb1l;
+------+------+------+
| bang | nama | tosi |
+------+------+------+
| A101 | 佐藤 | 40 |
| A102 | 高橋 | 28 |
| A103 | 中川 | 20 |
| A104 | 渡辺 | 23 |
| A105 | 西沢 | 35 |
+------+------+------+
5 rows in set (0.00 sec)

①mysql> CREATE VIEW V1
-> AS
-> SELECT nama,tosi
-> FROM tb1L;
Query OK, 0 rows affected (0.57 sec)

②mysql> SELECT * FROM V1;
+------+------+
| nama | tosi |
+------+------+
| 佐藤 | 40 |
| 高橋 | 28 |
| 中川 | 20 |
| 渡辺 | 23 |
| 西沢 | 35 |
+------+------+
5 rows in set (0.15 sec)

mysql>
※「SELECT」でレコードを表示させる方法も、テーブルを相手にしたときとまったく同じです。今回は1つのテーブルからカラムを抜き出しましたが、複数のテーブルを使って、しかも条件を設定して集めることも自由にできます。

(2-2)ビューからカラムの値を更新するp235

ビューは「元になるテーブルの一部分を表示している」という言い方ができます。 そのため、元になるテーブルの値が更新されれば、それを集めて表示しているビューの値も更新されます。 では逆に、ビューの値を更新したら、その元となるテーブルの値はどうなるでしょうか? 実は、ビューは「元となるテーブルの一部を表示している」のと同時に、「元になるテーブルのデータへの窓口」でもあるのです。よって、ビューの値を更新すれば、元になっているテーブルの値を更新されることになります。 ※実際にビュー「V1」のデータを変更して、ビューのデータ更新が元のテーブルに反映されることを確認してみょう。 ビュー「V1」の一番上、「A101」の「佐藤」さんの氏名を「主任・佐藤」に変更してみます。 ビューの値の変更は、通常のテーブルの変更と同じ様に「UPDATE~SET」を使います。

●実行される内容 p236

●操作手順

①次を実行する
UPDATE V1 SET nama='主任・佐藤' WHERE nama='佐藤';
まずは、ビュー「V1」が正しく変更されたか確認しましょう。
②次にSELECT文を実行してください。
SELECT * FROM V1;

□【実行結果】

mysql> UPDATE V1 SET nama='主任・佐藤' WHERE nama='佐藤';
Query OK, 1 row affected (0.19 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> SELECT * FROM V1;
+------------+------+
| nama | tosi |
+------------+------+
| 主任・佐藤 | 40 |
| 高橋 | 28 |
| 中川 | 20 |
| 渡辺 | 23 |
| 西沢 | 35 |
+------------+------+
5 rows in set (0.01 sec)

※ビュー「V1」は無事、更新されました。ではビュー「V1」の元になっているテーブル「tb1L」はどうでしょうか?
SELECT * FROM tb1L;

□【実行結果】

mysql> SELECT * FROM tb1L;
+------+------------+------+
| bang | nama | tosi |
+------+------------+------+
| A101 | 主任・佐藤 | 40 |
| A102 | 高橋 | 28 |
| A103 | 中川 | 20 |
| A104 | 渡辺 | 23 |
| A105 | 西沢 | 35 |
+------+------------+------+
5 rows in set (0.00 sec)

mysql>
※どうやら、元のテーブル「tb1L」の値も更新されているようです。これで、「ビューの値を更新すると、その元となるテーブルのデータも更新される」ということが確認できました。

(3)条件を設定してビューを作成するp237

(3-1)条件を設定してビューを作成

  前項では、単純には1つのテーブルから任意のカラムを集めてビューを作りました。 今度は、2つのテーブルから、さらに「WHERE」で条件を設定してビューを作ってみます。 まず、売上情報テーブル「tb」で、売上が100以上の優秀なレコードだけを抽出、あわせて社員情報テーブル「tb1L」結合して、その社員の氏名を表示させてみましょう。 内部結合の「JOIN」の使い方を参考にしてください。 ※テーブル「tb」にテーブル「tb1L」を結合し、売上(uria)の値が100以上のレコードだけを抽出し、「tb」の社員番号(bang)と売上(uria)、「tb1L」の氏名(nama)で構成するとビュー「V2」を作ります。さらに、ビュー「V2」のすべてのレコードを表示させましょう。

●実行される内容 p238

●操作手順

①次を実行する
CREATE VIEW v2
AS
SELECT tb.bang,tb1L.nama,tb.uria
FROM tb
JOIN tb1L
USING(bang)
WHERE tb.uria>=100;
②次を実行する
SELECT * FROM V2;

□【実行結果】

mysql> CREATE VIEW v2
-> AS
-> SELECT tb.bang,tb1L.nama,tb.uria
-> FROM tb
-> JOIN tb1L
-> USING(bang)
-> WHERE tb.uria>=100;
Query OK, 0 rows affected (0.57 sec)

mysql> SELECT * FROM V2;
+------+------------+------+
| bang | nama | uria |
+------+------------+------+
| A103 | 中川 | 101 |
| A104 | 渡辺 | 181 |
| A101 | 主任・佐藤 | 184 |
| A101 | 主任・佐藤 | 300 |
| A102 | 高橋 | 205 |
+------+------------+------+
5 rows in set (0.14 sec)

mysql>
※ビュー「V2」が作られ、「uria」の値が100以上の5レコードだけが表示されました。

(3-2)元になるテーブルを更新するとビューはどうなるか?

  前ページでは「uria」が100以上を抽出したビュー「V2」を作りました。 テーブル「tb」で、上から2番目の社員番号「A102」の社員の売上「uria」の「54」という値は100未満です。従って、もちろん「V2」には表示されません。

●テーブル p239

では、この値を100以上に変更して、ビューを作った後から抽出の条件をを満たしたらどうなるでしようか?
※実際にやってみよう。テーブル「tb」の「bang」が「A102」、「uria」が「54」のレコードで、「uria」の値を「777」に変更し、さらに、ビュー「V2」を表示してみよう。

●実行される内容p240

●操作手順

①次を実行する
UPDATE tb SET uria=777 WHERE uria=54;
②次を実行する
SELECT * FROM V2

□【実行結果】

mysql> UPDATE tb SET uria=777 WHERE uria=54;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> SELECT * FROM V2;
+------+------------+------+
| bang | nama | uria |
+------+------------+------+
| A103 | 中川 | 101 |
| A102 | 高橋 | 777 |
| A104 | 渡辺 | 181 |
| A101 | 主任・佐藤 | 184 |
| A101 | 主任・佐藤 | 300 |
| A102 | 高橋 | 205 |
+------+------------+------+
6 rows in set (0.00 sec)

mysql>
※ビュー「V2」の値も変更されました。つまり、ビューを構成する条件にに一致する場合、元になるテーブルが変更されれば、ビューのデータも変更されるということです。 さて、「uria=777」を、次を実行して元の「54」に戻してください。 UPDATE tb SET uria=54 WHERE uria=777;

mysql> UPDATE tb SET uria=54 WHERE uria=777;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> SELECT * FROM V2;
+------+------------+------+
| bang | nama | uria |
+------+------------+------+
| A103 | 中川 | 101 |
| A104 | 渡辺 | 181 |
| A101 | 主任・佐藤 | 184 |
| A101 | 主任・佐藤 | 300 |
| A102 | 高橋 | 205 |
+------+------------+------+
5 rows in set (0.00 sec)

mysql>

(3-3)ビューを確認するp242

  ここで、ビューの存在や構成を確認する方法をまとめておきます。基本的に、テーブルとビューの扱いは同じです。どんなビューが存在するのかを知るには、「SHOW TABLES;」を使います。

書式⇒ビューの存在を確認する

SHOW TABLES;
※テーブルに交ざってビューも表示されます。

□【実行結果】

mysql> SHOW TABLES;
+-----------------+
| Tables_in_db1 |
+-----------------+
| hizu_ziko |
| hizuke |
| ima |
| itii |
| nadake |
| renzoku |
| syokiti_renzoku |
| tb |
| tb1 |
| tb1b |
| tb1c |
| tb1g |
| tb1h |
| tb1i |
| tb1j |
| tb1k |
| tb1l |
| tb2 |
| tb3 |
| tb_2to5 |
| tb_a101 |
| tb_copy |
| tb_zyun |
| unig |
| v1 |
| v2 |
+-----------------+
26 rows in set (0.49 sec)

mysql>
※また、テーブルと同様に、カラム構造は「DESC」で表示できます。

●書式⇒ビューのカラム構造を表示

DESC ビュー名;

□【実行結果】

mysql> DESC V2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| bang | varchar(20) | YES | | NULL | |
| nama | varchar(10) | YES | | NULL | |
| uria | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.59 sec)

mysql>
※ビューに関する詳細の情報も、テーブルと同様に次のようにして表示できます。

●書式⇒ビューの詳細情報の表示

SHOW CREATE VIEW ビュー名;

mysql> SHOW CREATE VIEW V2;
-----------------+| View | Create View |+------+-------------------------------
--------------------------------------------------------------------------------
+| v2 | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY
DEFINER VIEW `v2` AS select `tb`.`bang` AS `bang`,`tb1l`.`nama` AS `nama`,`tb
`.`uria` AS `uria` from (`tb` join `tb1l` on((`tb`.`bang` = `tb1l`.`bang`)))
where (`tb`.`uria` >= 100) |+------+--------------------------------------------
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------

(4)ビューからの書き込みを制限するp243

(4-1)ビューに「INSERT」するとどうなるか?

  ビューを通して、元となるテーブルのデータを変更しました。今度は、ビューを通してレコードを「INSERT」してみることにしましょう。ビューは実体がなく、あくまで仮想的なテーブルです。その仮想的なビューにデータを入れると、いったい何が起きるでしょうか? ※ビューは、元になるテーブルからユーザーが勝手にカラムを集めたものです。つまり、ビューとして見えている部分は、元のテーブルの一部であることが多いはずです。 ビューに「INSERT」するということは、テーブルの一部だけにデータを挿入するということです。結論は、「ビューへのINSERTには制限がある」ということです。 例えば、「UNION」や「JOIN」,サブクエリなどを使っているビューでは、「INSERT」や「UPDATE」はできません。ただし、前項で作成したビューのように、単純に1つのテーブルからカラムを抜き出したものならば、問題なく「INSERT」も「UPDATE」もできます。 それでは、前に作成したビュー「V1」は、「tb1L」の氏名のカラム「nama」と年齢のカラム「tosi」の2カラムで構成されています。この「nama」と「tosi」にデータを挿入してみます。挿入の方法は、通常のテーブルへの挿入と同様です。ビュー「V1」に、「nama='アルバイト・石田'」「tosi=18」のレコードを挿入してみましょう。

●実行される内容 p244

●操作手順

①次を実行する
INSERT INTO V1 VALUES('アルバイト・石田',18);

□【実行結果】

mysql> INSERT INTO V1 VALUES('アルバイト・石田',18);
Query OK, 1 row affected, 1 warning (0.14 sec)

mysql> SELECT * FROM V1;
+------------+------+
| nama | tosi |
+------------+------+
| 主任・佐藤 | 40 |
| 高橋 | 28 |
| 中川 | 20 |
| 渡辺 | 23 |
| 西沢 | 35 |
| アルバイト | 18 |
+------------+------+ 6 rows in set (0.00 sec)

mysql>
※最後に、データを挿入したビュー「V1」の内容を確認します。 SELECT * FROM V1;

□【実行結果】

実行結果省略
※氏名と年齢がきれいに挿入されています。では、ビュー「V1」の元となっているテーブル「tb1L」はどうなっているでしょうか? SELECT * FROM tb1L;

□【実行結果】

mysql> SELECT * FROM tb1L;
+------+------------+------+
| bang | nama | tosi |
+------+------------+------+
| A101 | 主任・佐藤 | 40 |
| A102 | 高橋 | 28 |
| A103 | 中川 | 20 |
| A104 | 渡辺 | 23 |
| A105 | 西沢 | 35 |
| NULL | アルバイト | 18 |
+------+------------+------+
6 rows in set (0.01 sec)

mysql>
※どうやら、挿入した2つのデータ「アルバイト・石田」と「18」は、無事INSERTできているようです。そして、ビュー「V1」に定義されていないカラム「bang」は、データを入れていないので「NULL」が入ることになります。

(4-2)条件が設定されている元のテーブルにはどう反映されているか?

  少々意地悪いことですが、「条件を設定したビューに、条件に反するデータを挿入する」とどうなるでしょうか?試してみることにします。 まず、売上情報「tb」で「売上が100以上」の条件で「bang」と「uria」だけのカラムからなるビューを作ります。 具体的には、テーブル「tb」の社員番号(bang)と売上(uria)だけのカラムを、「uria>=100」の条件で集めたビュー「V3」を作成します。さらに、ビュー「V3」のすべてのレコードを表示してみよう。

●実行される内容 p246

●操作手順

①次を実行する
CREATE VIEW V3
AS
SELECT bang,uria
FROM tb
WHERE uria>=100;
②次を実行する
SELECT * FROM V3;

□【実行結果】

mysql> CREATE VIEW V3
-> AS
-> SELECT bang,uria
-> FROM tb
-> WHERE uria>=100;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM V3;
+------+------+
| bang | uria |
+------+------+
| A103 | 101 |
| A104 | 181 |
| A101 | 184 |
| A101 | 300 |
| A102 | 205 |
+------+------+
5 rows in set (0.00 sec)

mysql>
※売上が100以上のレコードだけ、「bang」と「uria」が表示されました。繰り返しになりますが、「ビューV3は、uriaが、100以上だけ」を集めたものです。つまり、ビュー「V3」には「uria」が100未満のデータは表示されない。ということになります。

●<ビューの条件に合わないデータの挿入>

  ここで、ビューにさらに意地悪るをしてやります。「100未満のデータは表示されない」ビュー「V3」に「100未満の値を入れてやる」のです。さてビュー「V3」はどんな反応を示すでしょうか。次は「uria」に「50」という100未満の数値を「INSERT」する例です。 INSERT INTO V3 VALUES('意地悪',50);

□【実行結果】

mysql> INSERT INTO V3 VALUES('意地悪',50);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM V3;
+------+------+
| bang | uria |
+------+------+
| A103 | 101 |
| A104 | 181 |
| A101 | 184 |
| A101 | 300 |
| A102 | 205 |
+------+------+
5 rows in set (0.00 sec)
※あっけなく入力されてしまいました。では、ビュー「V3」としてはどのように表示されるでしょうか?100未満は表示されないのですから、当然「SELECT * FROM V3;」では今入れた値は見えないはずですが。

□【実行結果】

※では、この元となっている「tb」ではどうでしょうか?
SELECT bang,uria FROM tb;

□【実行結果】

mysql> SELECT bang,uria FROM tb;
+--------+------+
| bang | uria |
+--------+------+
| A103 | 101 |
| A102 | 54 |
| A104 | 181 |
| A101 | 184 |
| A103 | 17 |
| A101 | 300 |
| A102 | 205 |
| A104 | 93 |
| A103 | 12 |
| A107 | 87 |
| 意地悪 | 50 |
+--------+------+
11 rows in set (0.01 sec)

mysql>
※なんと、元のテーブル「tb」には、意地悪にもかかわらず、値が入っているのです。 このようにデフォルトでは、「WHERE」の条件を無視して、元のテーブルにデータがINSERTせれてしまうのです。ちなみに、挿入していないカラムには例によってNULLが入ります。

(4-3)ビューの条件に合わない場合はエラーになるようにするp249

  ビューからの「INSERT」では、「WHERE」による条件と合わなくても、元のテーブルにはそのまま入力されてしまうことがわかりました。「意地悪は通用しない」ということなのでしょうか? しかし、制限かけているビューに「それを無視してデータが入力されては困る」というケースもあるでしょう。また、ビューから入力したデータを、そのビューで確認できないのもこまります。このようなケースに対応するには、ビューでは「条件に一致しないデータは認めない!」という設定も可能です。「WHERE」の条件と合わない入力ができないように設定するには「CREATE VIEW」でビューを作るとき、WITH CHECK OPTIONを付けて実行します。 例えば、次に「WITH CHECK OPTION」を付けてビュー「V4」を作成します。 WITH CHECKOPTION を付ける以外の設定は、
※ビュー「V3」のときと同じです。
CREATE VIEW V4
AS
SELECT bang,uria
FROM tb
WHERE uria>100
WITH CHECK OPTION;
※このように「WITH CHECK OPTION」を付けた場合、
INSERT INTO V4 VALUES('意地悪',50);
のように、条件に合わないデータを挿入しょうとすると、
「CHECK OPTION failed」というエラーになります。

【実行結果】

mysql> CREATE VIEW V4
-> AS
-> SELECT bang,uria
-> FROM tb
-> WHERE uria>100
-> WITH CHECK OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO V4 VALUES('意地悪',50);
ERROR 1369 (HY000): CHECK OPTION failed 'db1.v4'
mysql>
※これで、意地悪な入力ができなくなりました。

(5)ビューに上書き・変更・削除p250

(5-1)ビューの上書き

すでに同名のビューがあるとき、上書きしてビューを作成する方法です。 「CREATE VIEW」を実行するとき、作成しょうとする名前のビューがすでに存在する場合はエラーになります。このような場合に「CREATE OR REPLACE VIEW~」のようにOR REPLACEを付ければ、上書き(REPLACE)できます。つまり、すでに存在する同名のビューを削除して、新しく作るビューを作るということです。
例えば、すでにビュー「V1」が存在する状態で次を実行してください。
CREATE OR REPLACE VIEW V1
AS
SELECT NOW();
※問題なく上書きできるはずです。「V1」が削除され、常に現在の日時を表示するビュー「V1」に置き代わりました(「V1」を上書きしてしまいましたが、すぐ次の解説で元に戻しますのでご安心を)。 「その名前のビューがあるか、ないかがわからない」という状態で、とにかくビューを作ってみましょう、という方法です。前項のようにSQL文を一括して実行するときには、存在に関係なく作成できるこの命令は便利です。

(5-2)ビューのカラム構造を変更 p250

ビューの定義を変更するときには、ALTER VIEWを使います。

●書式⇒ビューのカラム構造を変更

SHOW CREATE VIEW ビュー名;
ALTER VIEW ビュー名 AS SELECT カラム名 FROM テーブル名;
※ほどんと、「CREATE VIEW~SELECT」で最初から作っていくのと同じです。前項でビュー「V1」を、「NOW()」の表示だけにしてしまったので、元に戻しておくことにします。 次に操作で、すでに存在するビュー「V1」を、テーブル「tb1」のすべてのレコードのカラム「nama」と「tosi」からの構成に変更できます。
ALTER VIEWV1
AS
SELECT nama,tosi
FROM tb1
※次の「ビューの削除」の方法で一度ビューを削除し、それから「CREATE VIEW~」を実行しても同じ結果になります。

(5-2)ビューの削除

MySQLで何かを削除するときは、「DROP」コマンドを使います。ビューの削除も「DROP」命令です。データベースやテーブルに対する命令と同じです。
書式⇒ビューの削除
DROP VIEW ビューの名前;
※ただし、削除の対象となるビューが存在しなければエラーになります。
もし、次のように「IF EXISTS」をつけておけば、対象となるビューが存在しなくてもエラーにはなりません。単純に削除が実行されないだけになります。
DROP VIEW IF EXISTS V1;

<まとめ>

●ビューはテーブルと違い実体がないということ
●ビューを利用するメリット
●ビューを作成する方法
●条件が設定してあるビューの更新と、元のテーブルへの影響
※「CREATE TABLE」で作成されたテーブルを実表といいます。実表は、ハードディスクなどの記憶装置に、実際にそのデータが書き込まれるものです。しかしビューは、テーブルのように利用できますが、その実体はありません。間違いが許されないデータベース管理。オリジナルのテーブルを保護する意味でも、ビューの活用は重要な技術と言えます。

<チェック>

□ビューがどのようなものであるか理解している
□「CREATE VIEW」を使って、ビューを作成することができる
□条件を設定したビューが作成できる
□条件に合わないデータの挿入を許可したり、禁止したりする方法がわかる

<練習問題>

問題1
次のテーブル「tb」で、カラム「uria」が50以上で、「bang」ごとの「uria」の平均で120以上のものだけを、「uria」の平均のおおいものから表示するビュー「V_uria」を作成してください。 【画像】

●実行される内容 p258

《解答1》

次を実行する
CREATE VIEW V_uria
AS SELECT
bang,AVG(uria)
FROM tb
WHERE uria>=50
GROUP BY bang
HAVING AVG(uria)>=120
ORDER BY AVG(uria) DESC;

【実行結果】

mysql> CREATE VIEW V_uria
-> AS SELECT
-> bang,AVG(uria)
-> FROM tb
-> WHERE uria>=50
-> GROUP BY bang
-> HAVING AVG(uria)>=120
-> ORDER BY AVG(uria) DESC;
Query OK, 0 rows affected (0.17 sec)
mysql> SELECT * FROM V_uria;
+------+-----------+
| bang | AVG(uria) |
+------+-----------+
| A101 | 242.0000 |
| A104 | 137.0000 |
| A102 | 129.5000 |
+------+-----------+
3 rows in set (0.60 sec)

mysql>

※テーブル「new_zaiko」の作成と確認を行ないます。