ビューとは
ビューとは SELECT 文による結果を基に作成される仮想的なテーブルのことである。
WHERE 句で絞り込んだ列だけを見せるテーブルや各種 JOIN を使って結合した結果を、仮想的なテーブルとして構成することができる。
ビューは、テーブルのあらかじめ定めた SELECT 文の実行結果を見る機能であり、結果は参照するたびに新しくつくられる。つまり、基になっているテーブルの値が変更されることでビューを参照した際にその変更が反映される。
いくつかのテーブルの列を組み合わせたテーブルが欲しいからといってその都度別テーブルとして作ってしまうと、更新時にはそれぞれを変更しなければならないが、ビューの場合はその必要がない。
ビューを作る
以下の 2 つのテーブルを INNER JOIN でつなげてビューを作る。
mysql> SELECT * FROM Protocol;
+------+------+--------+
| Id | Name | Layer4 |
+------+------+--------+
| 0 | HTTP | TCP |
| 1 | SSH | TCP |
| 2 | FTP | TCP |
| 3 | NFS | TCP |
| 4 | DHCP | UDP |
| 5 | SIP | UDP |
| 6 | DNS | UDP |
| 7 | SNMP | UDP |
+------+------+--------+
8 rows in set (0.00 sec)
mysql> SELECT * FROM Application;
+------------+----------+
| Name | Protocol |
+------------+----------+
| WebBrowser | HTTP |
| EFS | NFS |
| Bind | DNS |
| dhclient | DHCP |
+------------+----------+
4 rows in set (0.00 sec)
INNER JOIN でつなげた際の SQL は以下。
mysql> SELECT Id, Protocol.Name, Layer4, Application.Name AS Application FROM Protocol INNER JOIN Application ON Protocol.Name = Application.Protocol;
+------+------+--------+-------------+
| Id | Name | Layer4 | Application |
+------+------+--------+-------------+
| 0 | HTTP | TCP | WebBrowser |
| 3 | NFS | TCP | EFS |
| 4 | DHCP | UDP | dhclient |
| 6 | DNS | UDP | Bind |
+------+------+--------+-------------+
4 rows in set (0.00 sec)
上記の SELECT 文に CREATE VIEW [ビュー名] AS を追加すれば、ビューとして作成できる。
mysql> CREATE VIEW MyView AS SELECT Id, Protocol.Name, Layer4, Application.Name AS Application FROM Protocol INNER JOIN Application ON Protocol.Name = Application.Protocol;
Query OK, 0 rows affected (0.06 sec)
mysql> SELECT * FROM MyView;
+------+------+--------+-------------+
| Id | Name | Layer4 | Application |
+------+------+--------+-------------+
| 0 | HTTP | TCP | WebBrowser |
| 3 | NFS | TCP | EFS |
| 4 | DHCP | UDP | dhclient |
| 6 | DNS | UDP | Bind |
+------+------+--------+-------------+
4 rows in set (0.01 sec)
実際に元のレコードを変更したのちにもう一度ビューを見てみる。
mysql> UPDATE Application SET Name = 'Firefox' WHERE Name = 'WebBrowser';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM Application;
+----------+----------+
| Name | Protocol |
+----------+----------+
| Firefox | HTTP |
| EFS | NFS |
| Bind | DNS |
| dhclient | DHCP |
+----------+----------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM MyView;
+------+------+--------+-------------+
| Id | Name | Layer4 | Application |
+------+------+--------+-------------+
| 0 | HTTP | TCP | Firefox |
| 3 | NFS | TCP | EFS |
| 4 | DHCP | UDP | dhclient |
| 6 | DNS | UDP | Bind |
+------+------+--------+-------------+
4 rows in set (0.00 sec)
ビューの方も変更されていることがわかる。
なお、ビューに対して更新することもできる。
その場合はビューの基となっているテーブルが変更される。
mysql> UPDATE MyView SET Application = 'Safari' WHERE Id = 0;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM MyView;
+------+------+--------+-------------+
| Id | Name | Layer4 | Application |
+------+------+--------+-------------+
| 0 | HTTP | TCP | Safari |
| 3 | NFS | TCP | EFS |
| 4 | DHCP | UDP | dhclient |
| 6 | DNS | UDP | Bind |
+------+------+--------+-------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM Application;
+----------+----------+
| Name | Protocol |
+----------+----------+
| Safari | HTTP |
| EFS | NFS |
| Bind | DNS |
| dhclient | DHCP |
+----------+----------+
4 rows in set (0.00 sec)
ビューを削除するには DROP 文を用いれば良い。
mysql> DROP VIEW MyView;
Query OK, 0 rows affected (0.01 sec)