【SQL】SQL View (ビュー)

■ はじめに

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