[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
データの編集などを含んだ SELECT文 を別のテーブルの様に扱えるのが ビュー(VIEW) で毎回同じ SELECT文 を記述しなくても 通常のテーブルの様に扱えます。
この ビュー(VIEW) を作成を CREATE VIEW で行います。
CREATE VIEW について順を追って説明します。
■CREATE VIEWの書き方
CREATE VIEW文 の書式は以下の通りです。
1 2 3 4 | CREATE [ OR REPLACE ] VIEW view_name [(column_list)] AS select_statement -- view_name : ビューの名称 -- [(column_list)] : カラム名リスト(select_statement のカラムリストに名前を付ける) -- select_statement : ビューの元となる SELECT文 |
なお CREATE OR REPLACE VIEW の指定の場合は、既にビューが存在している場合は上書きを行います。
それでは簡単例のビューの作成を行ってみます。 ビューの元となる SELECT文 はリテラルの SELECT でも問題ないので、UNION の説明で使用した以下の SQL を当てます。
⇒ MySQL 異なるデータ取得(SELECT)結果を結合して取得する方法について(UNION)
1 2 3 4 | CREATE VIEW t_view AS SELECT '1' AS 'COL1' , '2' AS 'COL2' UNION SELECT 'A' AS 'COLA' , 'B' AS 'COLB' ; |
作成されたビューの一覧を表示します。
1 2 3 4 5 6 7 8 | MariaDB [test]> SELECT * FROM t_view; + ------+------+ | COL1 | COL2 | + ------+------+ | 1 | 2 | | A | B | + ------+------+ 2 rows in set (0.00 sec) |
それではビューのカラム名を変更してみます。 ビューの上書きなので以下の文となります。
1 2 3 4 | CREATE OR REPLACE VIEW t_view(COLUMN1, COLUMN2) AS SELECT '1' AS 'COL1' , '2' AS 'COL2' UNION SELECT 'A' AS 'COLA' , 'B' AS 'COLB' ; |
変更されたビューの一覧を表示します。 カラム名称が変更されたことが分かります。
1 2 3 4 5 6 7 8 | MariaDB [test]> SELECT * FROM t_view; + ---------+---------+ | COLUMN1 | COLUMN2 | + ---------+---------+ | 1 | 2 | | A | B | + ---------+---------+ 2 rows in set (0.00 sec) |
この様なリテラル表では面白くないので、テーブルを使った例を以降に記します。
■CREATE VIEW の元となるテーブルについて
以下のページで使用した 商品テーブル(マスタ) と 売上数量テーブル を使用してビューにします。
⇒ MySQL データ取得(SELECT)のWHRE句に サブクエリ条件で ANY ALL の使い方について(ANY、SOME、ALL)
商品テーブル(マスタ) と 売上数量テーブル は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | MariaDB [test]> SELECT * FROM product; + ----+----------+-------+ | id | name | price | + ----+----------+-------+ | 1 | 鉛筆A | 80 | | 2 | 鉛筆B | 100 | | 3 | くれよん | 500 | | 4 | 蛍光ペン | 120 | | 5 | 消しゴム | 150 | + ----+----------+-------+ 5 rows in set (0.00 sec) MariaDB [test]> SELECT * FROM sales; + ----+--------+------------+--------+ | id | id_prd | salesdate | volume | + ----+--------+------------+--------+ | 1 | 1 | 2024-01-04 | 10 | | 2 | 1 | 2024-01-07 | 15 | | 3 | 2 | 2024-01-07 | 20 | | 4 | 3 | 2024-01-05 | 1 | | 5 | 3 | 2024-01-10 | 2 | | 6 | 3 | 2024-01-15 | 2 | | 7 | 4 | 2024-01-05 | 5 | | 8 | 4 | 2024-01-14 | 3 | | 9 | 4 | 2024-01-20 | 1 | | 10 | 5 | 2024-01-20 | 5 | | 11 | 5 | 2024-01-22 | 10 | + ----+--------+------------+--------+ 11 rows in set (0.01 sec) |
商品テーブルと売上数量テーブルを連結しての商品名称入りの一覧を表示してみます。
今回のテストのための基本の SELECT文 となります。
1 2 3 4 | SELECT sales.id, sales.id_prd, product. name , sales.salesdate, sales.volume FROM sales LEFT JOIN product ON sales.id_prd = product.id ORDER BY sales.id; |
この SQL の結果は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | + ----+--------+----------+------------+--------+ | id | id_prd | name | salesdate | volume | + ----+--------+----------+------------+--------+ | 1 | 1 | 鉛筆A | 2024-01-04 | 10 | | 2 | 1 | 鉛筆A | 2024-01-07 | 15 | | 3 | 2 | 鉛筆B | 2024-01-07 | 20 | | 4 | 3 | くれよん | 2024-01-05 | 1 | | 5 | 3 | くれよん | 2024-01-10 | 2 | | 6 | 3 | くれよん | 2024-01-15 | 2 | | 7 | 4 | 蛍光ペン | 2024-01-05 | 5 | | 8 | 4 | 蛍光ペン | 2024-01-14 | 3 | | 9 | 4 | 蛍光ペン | 2024-01-20 | 1 | | 10 | 5 | 消しゴム | 2024-01-20 | 5 | | 11 | 5 | 消しゴム | 2024-01-22 | 10 | + ----+--------+----------+------------+--------+ 11 rows in set (0.00 sec) |
■CREATE VIEW とその利用
上記の商品名称入りの一覧表示の SELECT文 を使ってビューを作成します。
1 2 3 4 | CREATE VIEW v_sales(id_sal, id_prd, prd_name, salesdate, salesvol) AS SELECT sales.id, sales.id_prd, product. name , sales.salesdate, sales.volume FROM sales LEFT JOIN product ON sales.id_prd = product.id; |
作成されたビューを表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | MariaDB [test]> SELECT * FROM v_sales; + --------+--------+----------+------------+----------+ | id_sal | id_prd | prd_name | salesdate | salesvol | + --------+--------+----------+------------+----------+ | 1 | 1 | 鉛筆A | 2024-01-04 | 10 | | 2 | 1 | 鉛筆A | 2024-01-07 | 15 | | 3 | 2 | 鉛筆B | 2024-01-07 | 20 | | 4 | 3 | くれよん | 2024-01-05 | 1 | | 5 | 3 | くれよん | 2024-01-10 | 2 | | 6 | 3 | くれよん | 2024-01-15 | 2 | | 7 | 4 | 蛍光ペン | 2024-01-05 | 5 | | 8 | 4 | 蛍光ペン | 2024-01-14 | 3 | | 9 | 4 | 蛍光ペン | 2024-01-20 | 1 | | 10 | 5 | 消しゴム | 2024-01-20 | 5 | | 11 | 5 | 消しゴム | 2024-01-22 | 10 | + --------+--------+----------+------------+----------+ 11 rows in set (0.11 sec) |
カラム名がビュー作成で指定した名称になっていることが分かります。
なお、ビューは通常のテーブルの様に扱うことができます。
例えば WHERE で条件を付けたり、ORDER BY と LIMIT で表示を制限したりできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | MariaDB [test]> SELECT * FROM v_sales -> WHERE salesdate >= '2024-01-05' -> ORDER BY salesvol -> LIMIT 8; + --------+--------+----------+------------+----------+ | id_sal | id_prd | prd_name | salesdate | salesvol | + --------+--------+----------+------------+----------+ | 4 | 3 | くれよん | 2024-01-05 | 1 | | 9 | 4 | 蛍光ペン | 2024-01-20 | 1 | | 5 | 3 | くれよん | 2024-01-10 | 2 | | 6 | 3 | くれよん | 2024-01-15 | 2 | | 8 | 4 | 蛍光ペン | 2024-01-14 | 3 | | 7 | 4 | 蛍光ペン | 2024-01-05 | 5 | | 10 | 5 | 消しゴム | 2024-01-20 | 5 | | 11 | 5 | 消しゴム | 2024-01-22 | 10 | + --------+--------+----------+------------+----------+ 8 rows in set (0.03 sec) |
コメント