通常のビューは、問い合わせの定義を名前で参照できる仮想的な表です。検索結果そのものを別に保存するマテリアライズドビューとは区別します。ここでは、必要な列・行だけを見せる例で仕組みを確認します。
必要な列と行をビューにする
架空の社員表employeesにemployee_id・name・department・salaryがあるとします。次は営業部の社員IDと氏名を取り出す学習用のSQLです。
CREATE VIEW sales_staff AS
SELECT employee_id, name
FROM employees
WHERE department = '営業';
SELECT employee_id, name FROM sales_staff;
利用者はsales_staffという名前で検索できます。給与列はこのビューの出力には含めません。複数表のJOINも定義できますが、SQLを書く手間が減ることと、内部の結合処理が不要になることは別です。
コピーを保存する機能とは違う
PostgreSQLの通常のビューは、参照時に定義した問い合わせを評価します。結果を永続保存するものではありません。基の表が変われば問い合わせ結果も変わりますが、見える変更の範囲はトランザクションのスナップショットや分離レベルに従います。「常に全利用者の最新の変更が即座に見える」とは限りません。
更新できるかは定義とDBMSによる
単純なビューでは更新を基の表へ反映できる場合があります。一方、集計・DISTINCT・複数表の結合などを含むと、自動更新の条件を満たさない場合があります。PostgreSQLでは単純なビューの自動更新に条件があり、複雑なものではトリガーなど別の仕組みが必要になる場合もあります。
アクセス制限には権限設定も必要
列を省いたビューを用意するだけでは、基の表へのアクセス権まで自動的に消えません。利用者の権限、所有者と実行者の扱い、DBMSの設定を合わせて設計します。行を絞るビューの更新では、CHECK OPTIONが必要かも検討します。
| 比較 | 通常のビュー | マテリアライズドビュー |
| 主に保存するもの | 問い合わせの定義 | 問い合わせの定義と結果 |
| 参照 | 定義を評価して取得 | 保存された結果を取得 |
| 注意 | 更新可能性・権限・可視性 | 更新の反映時点・保存容量 |
集計結果を保存する場合は、マテリアライズドビューも確認しましょう。
確認問題
ビューにJOINを書けば、参照時のJOIN処理が必ず不要になりますか?
解答・解説を見る
いいえ。問い合わせを名前で再利用できることと、結果を保存することは別です。通常のビューで検索が必ず速くなるという保証もありません。
SELECT・集計をnoteで復習する
ビューの定義に使うSQLを復習したい方は、無料noteのSELECT・JOIN・GROUP BY・サブクエリの解説へ進みましょう。必要な行と列を取り出す基礎から確認できます。
資格・目的別のnote教材ナビから、ほかの教材も選べます。

コメント