勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

MySQLのview(ビュー)で仮想的なテーブルを作成する方法

  MySQL データベース

MySQL関連のサイトを見ているとview(ビュー)が云々という記事を見かけた。調べたところ仮想的なテーブルらしい。ただ、だいぶ前に使ったTEMPORARY TABLEとは違って一時的なテーブルではなく、明示的に削除しない限り保存されるテーブルみたい。以下に利用方法をメモ。

 

使用するテーブル情報

テーブル構造

mysql> SHOW COLUMNS FROM `test_table`;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | NO   |     | NULL    |                |
| age   | int          | NO   |     | NULL    |                |
| flg   | tinyint      | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

保存されているデータ

mysql> SELECT * FROM `test_table`;
+----+-----------+-----+-----+
| id | name      | age | flg |
+----+-----------+-----+-----+
|  1 | 山田      |  20 |   1 |
|  2 | 鈴木      |  25 |   0 |
|  3 | 佐々木    |  30 |   1 |
|  4 | 大地      |  35 |   0 |
|  5 | 佐藤      |  40 |   0 |
|  6 | 高橋      |  45 |   1 |
|  7 | 伊藤      |  50 |   0 |
+----+-----------+-----+-----+

 

利用方法

viewの作成

基本構文は以下の通り。

CREATE VIEW 【view名】 
AS 【SELECT文】

今回は以下SQLでviewを作成した。

CREATE VIEW test_view AS 
SELECT * 
FROM `test_table`
WHERE `flg` = 1;

viewの確認

基本的な確認方法

以下のように普通のSELECT文で確認できる。

SELECT * 
FROM test_view;

以下が結果になる。

+----+-----------+-----+-----+
| id | name      | age | flg |
+----+-----------+-----+-----+
|  1 | 山田      |  20 |   1 |
|  3 | 佐々木    |  30 |   1 |
|  6 | 高橋      |  45 |   1 |
+----+-----------+-----+-----+

元テーブルを編集した場合

ちなみに元テーブル(test_table)にデータを登録した場合、

INSERT INTO `test_table` 
    (`name`, `age`, `flg`) 
VALUES 
    ("渡辺", 55, 1);

以下のようにview側のテーブルにも反映される。

mysql> SELECT * FROM test_view;
+----+-----------+-----+-----+
| id | name      | age | flg |
+----+-----------+-----+-----+
|  1 | 山田      |  20 |   1 |
|  3 | 佐々木    |  30 |   1 |
|  6 | 高橋      |  45 |   1 |
|  8 | 渡辺      |  55 |   1 |
+----+-----------+-----+-----+

WHERE句で検索も可能

以下のようにview側のテーブルに対してWHERE句で検索も可能。

SELECT * 
FROM test_view
WHERE `age` > 20;

+----+-----------+-----+-----+
| id | name      | age | flg |
+----+-----------+-----+-----+
|  3 | 佐々木    |  30 |   1 |
|  6 | 高橋      |  45 |   1 |
|  8 | 渡辺      |  55 |   1 |
+----+-----------+-----+-----+

viewの削除

DROP VIEW test_view;

 

リファレンス

https://dev.mysql.com/doc/refman/8.0/ja/create-view.html

 

所感

使いどころ

実運用だと以下のようなケースで使えそう。

  • 同じテーブルでもサイト側とダッシュボード(管理画面)側で表示するデータが異なったりする(非表示フラグが立っている場合にサイト側では非表示、ダッシュボード側では表示等)ようなケース
  • 複数のJOINがあってSQL文が長いようなケース

更新時の注意点

view側のテーブルに更新する際は色々制限がある模様。基本的には元テーブルを更新し、view側のテーブルはSELECTのみで使うような形が安全かも。

 - MySQL データベース

  関連記事

MySQLでdatetime型データの〇日後を取得する方法(DATEDIFF)

MySQLでdatetime型データがあり、何日経過しているかを取得し、〇日経過 ...

MySQLで文字列を置換する方法

MySQLで文字列の置換を行いたかった。以下に方法をメモ。   目次1 ...

MySQLで検索した件数の取得

ページングとかで必要になる総件数について、 いつもググってしまっていたのでメモ。 ...

SortableJSを使ってデータの並べ替え&保存

あるシステムを拝見した際にtableタグ内に並んでいる項目をドラッグ&ド ...

MySQLとPHPの「image-comparator」ライブラリを使用して類似画像検索を実装する方法

先日PHPで画像を比較して類似度を算出する「image-comparator」ラ ...