【MySQL】ビューの基本操作 - 仮想テーブルの作成・一覧・詳細・変更・削除
MySQLのビューの基本操作について解説します。
検証環境
ビュー
ビューは“仮想テーブル”です。
SELECT文のクエリ内容で構成され、テーブルのように扱えます。
作成(CREATE VIEW
)
ビューの作成はCREATE VIEW文を使用します。
基本構文
CREATE VIEW ビュー名 (カラム名1, カラム名2 ...) AS SELECT文
ビューは名前はビュー名
、カラムはカラム名1, カラム名2 ...
によって構成されます。
カラムは前から順番にSELECT文で取得したカラムにマッチします。
サンプル
mysql> DESC items;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| price | int | YES | | NULL | |
| stock | int | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)
___ih_hl_start
mysql> CREATE VIEW fruits( id, name, unit_price )
-> AS SELECT id, name, price FROM items;
___ih_hl_end
Query OK, 0 rows affected (0.02 sec)
12〜13行目がCREATE VIEW文です。
ビューの名前をfruits
として、id
、name
、unit_price
の3カラムから構成されるビューを作成しています。
また、ビュー名の後の丸括弧(()
)を省略した場合、SELECT文のカラム名をそのまま使用します。
___ih_hl_start
mysql> CREATE VIEW same_items
-> AS SELECT id, name, price FROM items;
___ih_hl_end
Query OK, 0 rows affected (0.00 sec)
一覧表示(SHOW TABLE STATUS
)
ビューはテーブルと同様にSHOW TABLES文によって表示できます。
mysql> SHOW TABLES;
+----------------+
| Tables_in_mydb |
+----------------+
| fruits |
| items |
| same_items |
+----------------+
3 rows in set (0.00 sec)
ただし、SHOW TABLES文ではテーブルとビューが混同して表示されるため、ビューのみの一覧を表示するにはSHOW TABLE STATUS文を使用します。
基本構文
SHOW TABLE STATUS WHERE Comment = 'View';
この構文はそのまま使用できます。
サンプル
___ih_hl_start
mysql> SHOW TABLE STATUS WHERE Comment = 'View';
___ih_hl_end
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| fruits | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 2024-05-12 20:21:02 | NULL | NULL | NULL | NULL | NULL | VIEW |
| same_items | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 2024-05-12 20:21:53 | NULL | NULL | NULL | NULL | NULL | VIEW |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
2 rows in set (0.00 sec)
情報表示
ビューの情報や作成時クエリを表示できます。
情報(DESC
)
情報(ビュー構造)の表示はDESC文を使用します。
基本構文
DESC ビュー名
テーブルのDESC文と同様です。
サンプル
___ih_hl_start
mysql> DESC fruits;
___ih_hl_end
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id | int | NO | | 0 | |
| name | varchar(20) | YES | | NULL | |
| unit_price | int | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
基本的な見方はテーブルと同様です。
作成時クエリ(SHOW CREATE VIEW
)
作成時クエリの表示はSHOW CREATE VIEW文を使います。
基本構文
SHOW CREATE VIEW ビュー名
サンプル
___ih_hl_start
mysql> SHOW CREATE VIEW fruits;
___ih_hl_end
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View | character_set_client | collation_connection |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| fruits | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `fruits` (`id`,`name`,`unit_price`) AS select `items`.`id` AS `id`,`items`.`name` AS `name`,`items`.`price` AS `price` from `items` | utf8mb4 | utf8mb4_0900_ai_ci |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)
SHOW CREATE TABLE文でも同様の表示が可能です。
___ih_hl_start
mysql> SHOW CREATE TABLE fruits;
___ih_hl_end
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View | character_set_client | collation_connection |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| fruits | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `fruits` (`id`,`name`,`unit_price`) AS select `items`.`id` AS `id`,`items`.`name` AS `name`,`items`.`price` AS `price` from `items` | utf8mb4 | utf8mb4_0900_ai_ci |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)
データ取得(SELECT
)
ビューのデータ取得はテーブルと同様にSELECT文を使用します。
基本構文
SELECT カラム FROM ビュー名
テーブルのSELECT文と同様です。
サンプル
___ih_hl_start
mysql> SELECT * FROM fruits;
___ih_hl_end
+----+-----------+------------+
| id | name | unit_price |
+----+-----------+------------+
| 1 | Apple | 200 |
| 2 | Orange | 150 |
| 3 | Pineapple | 1100 |
| 4 | Grapes | 3500 |
| 5 | Melon | 3500 |
+----+-----------+------------+
5 rows in set (0.01 sec)
ビューは定義時のSELECT文によって構成されるため、テーブルのデータ変更等の影響を受けます。
mysql> INSERT INTO items ( name, price, stock ) VALUE ( 'Lemon', 80, 30 );
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM fruits;
+----+-----------+------------+
| id | name | unit_price |
+----+-----------+------------+
| 1 | Apple | 200 |
| 2 | Orange | 150 |
| 3 | Pineapple | 1100 |
| 4 | Grapes | 3500 |
| 5 | Melon | 3500 |
| 6 | Lemon | 80 |
+----+-----------+------------+
6 rows in set (0.00 sec)
変更(ALTER VIEW
)
ビューの変更はALTER VIEW文を使用します。
基本構文
ALTER VIEW ビュー名 ( カラム名1, カラム名2 ... ) AS SELECT文
サンプル
mysql> DESC fruits;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id | int | NO | | 0 | |
| name | varchar(20) | YES | | NULL | |
| unit_price | int | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
___ih_hl_start
mysql> ALTER VIEW fruits ( id, name )
-> AS SELECT id, name FROM items;
___ih_hl_end
Query OK, 0 rows affected (0.01 sec)
mysql> DESC fruits;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | 0 | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
11〜12行目がALTER VIEW文です。
fruits
ビューのカラムを変更しており、その後のDESC文からunit_price
カラムが減ったことが分かります。
削除(DROP VIEW
)
ビューの削除はDROP VIEW文を使用します。
基本構文
DROP VIEW ビュー名
サンプル
mysql> SHOW TABLE STATUS WHERE Comment = 'View';
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| fruits | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 2024-05-12 20:21:02 | NULL | NULL | NULL | NULL | NULL | VIEW |
| same_items | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 2024-05-12 20:21:53 | NULL | NULL | NULL | NULL | NULL | VIEW |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
2 rows in set (0.01 sec)
___ih_hl_start
mysql> DROP VIEW same_items;
___ih_hl_end
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW TABLE STATUS WHERE Comment = 'View';
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| fruits | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 2024-05-12 20:21:02 | NULL | NULL | NULL | NULL | NULL | VIEW |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
1 row in set (0.00 sec)
mysql> SHOW TABLES;
+----------------+
| Tables_in_mydb |
+----------------+
| fruits |
| items |
+----------------+
2 rows in set (0.00 sec)
10行目がDROP VIEW文です。
same_items
ビューを削除しており、その後のビュー・テーブルの一覧表示にないことから、正常に削除できたことが分かります。