11ビューを使いこなす(備忘録)→ > 01p > 02p > 03p > 04p > 05p > END
11ビューを使いこなす(p232)
(1)ビューとは何か
(2)ビュー利用する
(3)条件を設定してビューを作成するp237
(4)ビューからの書き込みを制限するp243
(5)ビューに上書き・変更・削除p250
<まとめ>
<チェック>
<練習問題>
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」の作成と確認を行ないます。