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 ビューに |
| 論理データ独立性 | テーブル変更をビューで吸収 | 列名変更の影響を遮断 |
| 再利用性 | 同じロジックを複数箇所で再利用 | 月次集計ビューを複数レポートで参照 |
| 条件 | 更新 |
|---|---|
| 単一テーブル・全主キーを含む・集計なし・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', '鈴木', '大阪'); -- エラー
クエリ結果を実際にディスクに保存する仮想テーブル。参照は高速だが元データ変更時に REFRESH が必要。
| 特性 | 通常ビュー | マテリアライズドビュー |
|---|---|---|
| データ保存 | ❌ 定義のみ | ✅ 結果をディスク保存 |
| 参照速度 | 毎回クエリ実行 | 高速(保存済みを読む) |
| 最新性 | 常に最新 | REFRESH するまで古い可能性 |
| 主な用途 | 論理独立性・セキュリティ | DWH・集計レポート |
-- 手動更新 REFRESH MATERIALIZED VIEW 月次売上集計; -- PostgreSQL: 参照をブロックしない更新 REFRESH MATERIALIZED VIEW CONCURRENTLY 月次売上集計;
読了ボタンを押すとトップページの進捗に反映されます