CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ] [ WITH ( view_option_name [= view_option_value] [, ... ] ) ] AS query
CREATE VIEWは問い合わせによるビューを定義します。 ビューは物理的な実体として存在するものではありません。 その代わり、問い合わせでビューが参照される度に、指定された問い合わせが実行されます。
CREATE OR REPLACE VIEWも同様の働きをしますが、 このコマンドでは、同じ名前のビューが既に存在している場合、そのビューを置き換えます。 新しい問い合わせは、既存のビュー問い合わせが生成する列と同じ列(つまり、同じ順序の同じデータ型の同じ列名)を生成しなければなりません。 しかし、そのリストの最後に列を追加しても構いません。 出力列を生成する計算をまったく異なるものにしても構いません。
スキーマ名が付けられている場合(例えば、CREATE VIEW myschema.myview ...)、ビューは指定されたスキーマで作成されます。 スキーマ名がなければ、そのビューは現在のスキーマで作成されます。 一時ビューは特別なスキーマで作成されます。 そのため、一時ビューを作成する時にはスキーマ名を付けることはできません。 ビュー名は、同じスキーマ内の他のビュー、テーブル、シーケンス、インデックス、外部テーブルとは異なる名前である必要があります。
これが指定された場合、ビューは一時ビューとして作成されます。 現在のセッションが終わった時、一時ビューは自動的に削除されます。 一時ビューが存在する間、現在のセッションでは、これと同じ名前の永続リレーションはスキーマで修飾した名前で参照していない限り不可視です。
ビューで参照されるテーブルの一部が一時テーブルであった場合、(TEMPORARYの指定があってもなくても)ビューは一時ビューとして作成されます。
再帰的ビューを作成します。 以下の構文
CREATE RECURSIVE VIEW name (columns) AS SELECT ...;
CREATE VIEW name AS WITH RECURSIVE name (columns) AS (SELECT ...) SELECT columns FROM name;
と同じです。 再帰的ビューではビューの列リストを指定する必要があります。
作成するビューの名前です(スキーマ修飾名も可)。
ビューの列名として使用する名前のリストです。このパラメータは省略可能です。省略された場合、問い合わせに由来する名前が使用されます。
この句はビュー用の省略可能なパラメータを指定します。 現時点でサポートされるパラメータ名はsecurity_barrierのみです。 行レベルのセキュリティを提供することを意図したビューでは、これを有効にしなければなりません。 詳細については項38.5を参照してください。
ビューを削除するには、DROP VIEW文を使用してください。
ビューの列の名前と型は指定通りに割り当てられることに注意してください。 例えば、次のコマンドを見てください。
CREATE VIEW vista AS SELECT 'Hello World';
この例は、次の2点から好ましくありません。 まず、列の名前がデフォルトの?column?になります。さらに、列のデータ型もデフォルトのunknownになってしまいます。 ビューの結果として文字リテラルを返したい場合は、次のように指定してください。
CREATE VIEW vista AS SELECT text 'Hello World' AS hello;
ビューが参照するテーブルにアクセスできるかどうかは、ビューの所有者の権限で決定されます。 これは、場合によっては、背後のテーブルへのアクセスが制限されますが、安全性を提供するために使用することができます。 しかしすべてのビューが不正な改変に対して安全ではありません。 項38.5を参照してください。 ビュー内で実行される関数については、ビューを使用した問い合わせにおいて、その関数が直接呼び出された場合と同様に扱われます。 したがって、ビューを使用するユーザには、ビュー内で使用される全ての関数を呼び出す権限が必要です。
CREATE OR REPLACE VIEWが既存のビューに対して使用されると、ビューを定義するSELECTルールのみが変更されます。 所有者情報、権限、SELECT以外のルールなど他のビューの属性はそのまま変更されません。 置き換えるためにはビューの所有者(所有ロールのメンバである場合も含む)でなければなりません。
簡単なビューは自動的に更新可能です。 システムは、ビューに対するINSERT、UPDATE、DELETE文を通常のテーブルの場合と同じ方法で使用できるようにします。 以下の条件のすべてを満たす場合に、ビューは自動的に更新可能です。
ビューのFROMリストでは正確に1つの項目を持たなければならず、それはテーブルまたは他の更新可能ビューでなければなりません。
ビューの定義の最上位レベルにおいてWITH、DISTINCT、GROUP BY、HAVING、LIMIT、OFFSETを含めてはなりません。
ビューの定義の最上位レベルにおいて集合操作(UNION、INTERSECT、EXCEPT)を含めてはなりません。
ビューの選択リスト内の列はすべて基となるリレーションの列に対する単純な参照でなければなりません。 式、リテラル、関数とすることはできません。 システム列も参照することができません。
ビューの選択リストにおいて元となるリレーションの列を複数回記述することができません。
ビューはsecurity_barrier属性を持ってはなりません。
ビューが自動更新可能であれば、システムはビューに対するINSERT、UPDATEまたはDELETE文を基となるベースリレーションへの対応する文に変換します。
自動更新可能ビューがWHERE条件を持つ場合、 ベースリレーションのどの行をビューに対するUPDATE、DELETE文により変更可能かをその条件が制限します。 しかしUPDATEによる行の変更の結果WHEREを満たさなくなることがあり得ます。 その場合、ビューからは参照することができなくなります。 同様にINSERTWHERE条件を満たさない行をベースリレーションに挿入する可能性があり、同様にビューを通して参照することができません。
これらの条件をすべて満たさないより複雑なビューはデフォルトで読み取り専用です。 システムはビューに対する挿入、更新、削除を許可しません。 ビューに対するINSTEAD OFトリガを作成することで、更新可能ビューの効果を得ることができます。 このトリガはビューに対する挿入試行などを他のテーブルに対する適切な操作に変換するものでなければなりません。 詳細についてはCREATE TRIGGERを参照してください。 他にもルールを作成する(CREATE RULE参照)ことでも実現できますが、実際にはトリガの方が理解しやすく正しく使用することができます。
ビューに対する挿入、更新、削除を行うユーザは、ビューに対して対応する挿入、更新、削除権限を持たなければなりません。 さらにビューの所有者は基となるベースリレーションに対する適切な権限を持たなければなりません。 しかし、更新を行うユーザは基となるベースリレーションに対する権限をまったく必要としません(項38.5参照)。
全てのコメディ映画(Comedy films)からなるビューを作成します。
CREATE VIEW comedies AS SELECT * FROM films WHERE kind = 'Comedy';
これはビューを作成した時点でfilmテーブル内にある列を持つビューを作成します。 ビューを作成するために*が使用されていますが、その後にテーブルに追加された列はビューには含まれません。
1から100までの数からなる再帰的ビューを作成します。
CREATE RECURSIVE VIEW nums_1_100 (n) AS VALUES (1) UNION ALL SELECT n+1 FROM nums_1_100 WHERE n < 100;
標準SQLのCREATE VIEW文には、さらにいくつかの機能が規定されています。
CREATE VIEW name [ ( column_name [, ...] ) ] AS query [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
このSQLコマンドの全てのオプション句について、次に説明します。
このオプションは自動更新可能ビューの動作を制御します。 指定されると、ビューに対するINSERTおよびUPDATEコマンドは、新しい行がビュー定義の条件を確実に満たすか(つまり新しい行がビューを通して参照できるか)検\\ 査されます。 満たさない場合は更新は拒否されます。 CHECK OPTIONがない場合、ビューに対するINSERTおよびUPDATEにより、ビューを通して参照できない行を作成することができます。 (現時点では後者の動作はPostgreSQLによってのみ提供されています。)
このビューの整合性を検査します。
このビューと依存している全てのビューの整合性を検査します。 CASCADEDまたはLOCALのいずれも指定されていない場合は、CASCADEDとして扱われます。
CREATE OR REPLACE VIEWはPostgreSQLの言語拡張です。 つまり一時ビューという概念も言語拡張です。 同様にWITH句も拡張です。