■ はじめに
SQL の View に関して、メモ。
目次
【1】View (ビュー)とは? 【2】メリット・デメリット 【3】構文 1)作成 2)削除 【4】サンプル 例1:その年の最新実行されたデータを取得するビュー(PostgreSQL)
【1】View (ビュー)とは?
* 実テーブルから作られる仮想的なテーブル => データが実際に保存されている訳でなく、構造のみを提供している
【2】メリット・デメリット
1)メリット
* 何回も使用する複雑なクエリに対して、 ビューとして定義しておけば、単純なクエリを実行するだけですむ => 可読性向上により、メンテナンスしやすくなる => テーブルをJoinするテーブル関係をViewにしておくと非常に便利!
2)デメリット(使用上の注意)
* パフォーマンスが良くないため、使いすぎ注意! ビューを使用するたびに、ビューを構成するSELECT文が実行されるためである。 ビューをを利用して、別のビューを作成することは可能だが、 パフォーマンスが犠牲になることに注意。 * ビュー定義のクエリに集約操作(UNION, MAXなど)が含まれている場合、 非効率的なSQLとなり、速度低下を招くことが恐れがある。
【3】構文
1)作成
CREATE VIEW [ビュー名] AS [SQL文]
PostgreSQL
https://www.postgresql.jp/document/9.3/html/sql-createview.html
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ] [ WITH ( view_option_name [= view_option_value] [, ... ] ) ] AS query
2)削除
DROP VIEW [ビュー名]
【4】サンプル
例1:その年の最新実行されたデータを取得するビュー(PostgreSQL)
/** 以下の関連記事の「例2:最新データによる年間売上の増減」をView化する https://dk521123.hatenablog.com/entry/2012/07/26/013620 */ CREATE VIEW v_latest_sale(year, sales, create_at) AS SELECT s1.year AS year, s1.sales AS sales, s1.create_at FROM sale AS s1 WHERE s1.create_at=(SELECT MAX(create_at) FROM sale AS s2 WHERE s1.year=s2.year) ; SELECT s1.year AS year, CASE WHEN s1.sales = s2.sales THEN '→' WHEN s1.sales > s2.sales THEN '↑' WHEN s1.sales < s2.sales THEN '↓' ELSE '-' END AS up_or_down, s1.sales AS sales, s2.sales AS previous_sales, s1.sales - s2.sales AS diff FROM v_latest_sale AS s1, v_latest_sale AS s2 WHERE s2.year=(SELECT MAX(year) FROM sale AS s3 WHERE s1.year > s3.year) ORDER BY s1.year DESC LIMIT 5 ;
出力結果
"year","up_or_down","sales","previous_sales","diff" "2021","→","2710","2710","0" "2020","↓","2710","2810","-100" "2018","↑","2810","2310","500" "2017","↑","2310","1640","670" "2014","↓","1640","1720","-80"
参考文献
http://www.techscore.com/tech/sql/SQL9/09_01.html/
http://sql.1keydata.com/jp/sql-create-view.php
http://www.atmarkit.co.jp/fnetwork/rensai/sql15/sql1.html
関連記事
WITH句 ~ 共通テーブル式 ~
https://dk521123.hatenablog.com/entry/2012/07/26/013620