ビュー

August 05, 2018

ビューとは

ビューとは 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)  

 © 2023, Dealing with Ambiguity