MySQL道普請便り

第58回 viewの使いどころを考えてみよう

この記事を読むのに必要な時間:およそ 4 分

viewを試してみよう

みなさんは普段MySQLでviewを使っているでしょうか? viewは定義した構文をもとに,あたかもテーブルが存在するかのように仮想的なテーブルを定義できる機能になります。実際にはview自体はデータを持たず,定義したviewに従って各テーブルからデータを取得しています。ORACLEやPostgreSQLのようなマテリアライズドビューはMySQLにはありませんが,viewそのものの機能はMySQL5.0から追加されました。

今回はviewの機能を紹介しながら,使い所を考えていきたいと思います。

MySQLでのviewの作成方法

まず,テストデータとして下記のような,名前と電話番号をもつテーブルを定義してみます。

mysql> CREATE DATABASE d1;
Query OK, 1 row affected (0.00 sec)

mysql> use d1
Database changed
mysql> CREATE TABLE t1 (id int,name varchar(20),phone varchar(11));
Query OK, 0 rows affected (0.07 sec)

mysql> INSERT INTO t1 VALUES (1,'aaa','11111111111'), (2,'bbb','22222222222'),(3,'ccc','33333333333');
Query OK, 3 rows affected (0.12 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t1;
+------+------+-------------+
| id   | name | phone       |
+------+------+-------------+
|    1 | aaa  | 11111111111 |
|    2 | bbb  | 22222222222 |
|    3 | ccc  | 33333333333 |
+------+------+-------------+
3 rows in set (0.00 sec)

viewを作成する時はCREATE VIEW構文を用いて,CREATE VIEW 〈view_name〉 AS 〈SELECT_statement〉を使って定義します。今回はphoneカラムを除いたviewをt1_viewとして定義してみます。

mysql> CREATE VIEW t1_view AS SELECT id, name FROM t1;
Query OK, 0 rows affected (0.11 sec)

mysql> SHOW TABLES;
+--------------+
| Tables_in_d1 |
+--------------+
| t1           |
| t1_view      |
+--------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM t1_view;
+------+------+
| id   | name |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
+------+------+
3 rows in set (0.01 sec)

viewを作成することができました。データもphoneカラムを除いて表示されています。

続いて2つのテーブルをJOINするようなviewを作ってみます。

mysql> CREATE TABLE t2(id int, email varchar(256));
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO t2 VALUES (2,'bbb@bbb.net'),(3,'ccc@ccc.com');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> CREATE view t1_t2_view AS SELECT t1.id, t1.name, t2.email FROM t1 INNER JOIN t2 ON t1.id = t2.id;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM t1_t2_view;
+------+------+-------------+
| id   | name | email       |
+------+------+-------------+
|    2 | bbb  | bbb@bbb.net |
|    3 | ccc  | ccc@ccc.com |
+------+------+-------------+
2 rows in set (0.00 sec)

viewを取得するSQLだけでt1テーブルとt2テーブルがJOINされた結果が返ってきました。

viewの変更,削除

続いてはviewの定義変更,viewの削除を行います。viewの変更はALTER VIEW 〈view_name〉 AS 〈SELECT_statement〉,削除はDROP VIEW 〈view_name〉を使います。また,CREATE OR REPLACE VIEW を使うと既存のviewが存在する場合はALTER VIEW,ない場合はCREATE VIEWが実行されます。

mysql> ALTER VIEW t1_view AS SELECT id, phone FROM t1;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM t1_view;
+------+-------------+
| id   | phone       |
+------+-------------+
|    1 | 11111111111 |
|    2 | 22222222222 |
|    3 | 33333333333 |
+------+-------------+
3 rows in set (0.00 sec)

mysql> DROP VIEW t1_view;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW TABLES;
+--------------+
| Tables_in_d1 |
+--------------+
| t1           |
+--------------+
1 row in set (0.00 sec)

ただし,サブクエリを使ったviewの作成やユーザー変数の変更などはできません。詳しい制限は公式ドキュメントの13.1.20 CREATE VIEW 構文をご確認ください。

コメント

コメントの記入