頻出高 ⏱ 6分★★★★☆

ビュー

WITH CHECK OPTION・マテリアライズドビュー・更新可否を完全網羅

SELECT 文に名前を付けて仮想テーブルとして扱う仕組み。実データは持たず、参照時に内部クエリが実行される。

ビューはデータを「持つ」のではなく「見せ方を定義する」だけ。テーブル構造が変わったときにビューを修正して変更を吸収できる。
-- 作成
CREATE VIEW 重要顧客ビュー AS
  SELECT 顧客ID, 顧客名, 合計購入額
  FROM   顧客
  WHERE  合計購入額 >= 100000
    AND  有効フラグ = '1';

-- 利用(通常テーブルと全く同じ記法)
SELECT * FROM 重要顧客ビュー WHERE 顧客名 LIKE '山%';

-- 定義変更
CREATE OR REPLACE VIEW 重要顧客ビュー AS ...;

-- 削除
DROP VIEW 重要顧客ビュー;
活用ユースケース
目的説明
アクセス制御特定の列・行だけを公開給与列を隠した社員ビュー
複雑さの隠蔽複雑な JOIN/集計を簡単なビューで提供4 テーブル JOIN を 1 ビューに
論理データ独立性テーブル変更をビューで吸収列名変更の影響を遮断
再利用性同じロジックを複数箇所で再利用月次集計ビューを複数レポートで参照
INSERT/UPDATE/DELETE が可能かどうか
条件更新
単一テーブル・全主キーを含む・集計なし・DISTINCT なし✅ 可能
複数テーブルの JOIN❌ 原則不可
GROUP BY / 集計関数(SUM, COUNT...)❌ 不可
DISTINCT を含む❌ 不可
CREATE VIEW 東京顧客ビュー AS
  SELECT * FROM 顧客 WHERE 都道府県 = '東京'
  WITH CHECK OPTION;

-- 成功:都道府県=東京 を満たす
INSERT INTO 東京顧客ビュー VALUES ('C99', '山田', '東京');

-- 失敗:都道府県=大阪 はビューの WHERE を外れる
INSERT INTO 東京顧客ビュー VALUES ('C100', '鈴木', '大阪');  -- エラー
WITH CHECK OPTION はビューの WHERE 条件を外れた INSERT/UPDATE を拒否する。データの整合性をビューレベルで強制できる。

クエリ結果を実際にディスクに保存する仮想テーブル。参照は高速だが元データ変更時に REFRESH が必要。

通常ビュー vs マテリアライズドビュー
特性通常ビューマテリアライズドビュー
データ保存❌ 定義のみ✅ 結果をディスク保存
参照速度毎回クエリ実行高速(保存済みを読む)
最新性常に最新REFRESH するまで古い可能性
主な用途論理独立性・セキュリティDWH・集計レポート
-- 手動更新
REFRESH MATERIALIZED VIEW 月次売上集計;

-- PostgreSQL: 参照をブロックしない更新
REFRESH MATERIALIZED VIEW CONCURRENTLY 月次売上集計;

📝 理解度チェック

WITH CHECK OPTION を付けたビューへの INSERT が拒否されるのはどの場合か?
マテリアライズドビューが通常ビューと異なる点はどれか?
ビューへの DML(INSERT/UPDATE)が可能な条件はどれか?

読了ボタンを押すとトップページの進捗に反映されます