viewを試してみよう
みなさんは普段MySQLでviewを使っているでしょうか? viewは定義した構文をもとに、
今回は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構文を用いて、
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,'[email protected]'),(3,'[email protected]'); 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 | [email protected] | | 3 | ccc | [email protected] | +------+------+-------------+ 2 rows in set (0.00 sec)
viewを取得するSQLだけでt1テーブルとt2テーブルがJOINされた結果が返ってきました。
viewの変更、削除
続いては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のアルゴリズム
viewを作成する際にALGORITHM=〈algorithm_
MERGE
viewを参照するSELECT文のテキストとviewがマージされた後、
SELECT * FROM t1_view WHERE id = 1; SELECT id, phone FROM t1 WHERE id = 1;
TEMPTABLE
viewの結果がテンポラリーテーブル内に取得され、
SELECT * FROM t1_view WHERE id = 1; SELECT * FROM (SELECT id, phone FROM t1) AS t1_view WHERE id = 1;
UNDEFINED
MySQLが実行時に効率が良いのはMERGEなのかTEMPTABLEなのかを判断して実行されます。デフォルトはUNDEFINEDになります。基本的にはMERGEが選択されるようですが、
viewを使ってデータを操作する
viewによってはデータの更新が可能な場合があり、
mysql> SELECT * FROM t1_view; +------+------+ | id | name | +------+------+ | 1 | aaa | | 2 | bbb | | 3 | ccc | +------+------+ 3 rows in set (0.00 sec) mysql> INSERT INTO t1_view VALUES (4,'ddd'); Query OK, 1 row affected (0.01 sec) mysql> SELECT * FROM t1_view; +------+------+ | id | name | +------+------+ | 1 | aaa | | 2 | bbb | | 3 | ccc | | 4 | ddd | +------+------+ 4 rows in set (0.00 sec) mysql> SELECT * FROM t1; +------+------+-------------+ | id | name | phone | +------+------+-------------+ | 1 | aaa | 11111111111 | | 2 | bbb | 22222222222 | | 3 | ccc | 33333333333 | | 4 | ddd | NULL | +------+------+-------------+ 4 rows in set (0.00 sec)
t1_
このviewを使ってデータを操作するには、
viewの情報を取得する
SHOW TABLESの構文では対象がTABLEなのかviewなのか判断できません。しかし、
MySQL5.
mysql> SELECT table_name, table_schema FROM information_schema.views WHERE table_schema != ('sys'); +------------+--------------+ | TABLE_NAME | table_schema | +------------+--------------+ | t1_view | d1 | +------------+--------------+ 1 rows in set (0.01 sec)
また、
この2つを組み合わせることで、
create view文を取得する例
$ MYSQL_PWD=***** mysql -sse "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.views WHERE TABLE_SCHEMA != 'sys'" | while read table_scema table_name; do MYSQL_PWD=***** mysql -sse "show create view $table_scema.$table_name" | awk -F'\t' '{print$2";"}'; done CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `d1`.`t1_t2_view` AS select `d1`.`t1`.`id` AS `id`,`d1`.`t1`.`name` AS `name`,`d1`.`t2`.`email` AS `email` from (`d1`.`t1` join `d1`.`t2` on((`d1`.`t1`.`id` = `d1`.`t2`.`id`))); CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `d1`.`t1_view` AS select `d1`.`t1`.`id` AS `id`,`d1`.`t1`.`name` AS `name` from `d1`.`t1`;
viewの使いどころを考える
ここまではviewの使い方をみてきましたが、
viewの機能を利用することでメリットとなる部分は
- 特定のカラムだけを表示させることが可能になる。
(それ以外のカラムを表示させないようにできる) - JOINが多いSQLは再利用するのであればviewによって簡潔に記述することができ、
他人でも理解し易いSQLになる
といったことが考えられます。
たとえば1つ目ののメリットを考えると、
また、
まとめ
今回はMySQLのviewの使い方とその使いどころについて説明していきました。多少制限はありますが、