CREATE VIEWは問い合わせによるビューを定義します。 ビューは物理的な実体として存在するものではありません。 その代わり、問い合わせでビューが参照される度に、指定された問い合わせが実行されます。
CREATE OR REPLACE VIEWも同様の働きをしますが、 このコマンドでは、同じ名前のビューが既に存在している場合、そのビューを置き換えます。 新しい問い合わせは、既存のビュー問い合わせが生成する列と同じ列(つまり、同じ順序の同じデータ型の同じ列名)を生成しなければなりません。 しかし、そのリストの最後に列を追加しても構いません。 出力列を生成する計算をまったく異なるものにしても構いません。
スキーマ名が付けられている場合(例えば、CREATE VIEW myschema.myview ...)、ビューは指定されたスキーマで作成されます。 スキーマ名がなければ、そのビューは現在のスキーマで作成されます。 一時ビューは特別なスキーマで作成されます。 そのため、一時ビューを作成する時にはスキーマ名を付けることはできません。 ビュー名は、同じスキーマ内の他のビュー、テーブル、シーケンス、インデックスとは異なる名前である必要があります。
これが指定された場合、ビューは一時ビューとして作成されます。 現在のセッションが終わった時、一時ビューは自動的に削除されます。 一時ビューが存在する間、現在のセッションでは、これと同じ名前の永続リレーションはスキーマで修飾した名前で参照していない限り不可視です。
ビューで参照されるテーブルの一部が一時テーブルであった場合、(TEMPORARYの指定があってもなくても)ビューは一時ビューとして作成されます。
作成するビューの名前です(スキーマ修飾名も可)。
ビューの列名として使用する名前のリストです。このパラメータは省略可能です。省略された場合、問い合わせに由来する名前が使用されます。
現在のところ、ビューは読み取り専用です。 システムは、ビューに対する挿入、更新、削除を許可しません。 しかし、ビューに対する挿入などを他のテーブルに対する処理に書き換えるルールを作成することで、更新可能なビューと同じように扱うことができます。 詳細については、CREATE RULEを参照してください。
ビューを削除するには、DROP VIEW文を使用してください。
ビューの列の名前と型は指定通りに割り当てられることに注意してください。 例えば、次のコマンドを見てください。
CREATE VIEW vista AS SELECT 'Hello World';
この例は、次の2点から好ましくありません。 まず、列の名前がデフォルトの?column?になります。さらに、列のデータ型もデフォルトのunknownになってしまいます。 ビューの結果として文字リテラルを返したい場合は、次のように指定してください。
CREATE VIEW vista AS SELECT text 'Hello World' AS hello;
ビューが参照するテーブルにアクセスできるかどうかは、ビューの所有者の権限で決定されます。 これは、場合によっては、背後のテーブルへのアクセスが制限されますが、安全性を提供するために使用することができます。 しかしすべてのビューが不正な改変に対して安全ではありません。 項37.4を参照してください。 ビュー内で実行される関数については、ビューを使用した問い合わせにおいて、その関数が直接呼び出された場合と同様に扱われます。 したがって、ビューを使用するユーザには、ビュー内で使用される全ての関数を呼び出す権限が必要です。
CREATE OR REPLACE VIEWが既存のビューに対して使用されると、ビューを定義するSELECTルールのみが変更されます。 所有者情報、権限、SELECT以外のルールなど他のビューの属性はそのまま変更されません。 置き換えるためにはビューの所有者(所有ロールのメンバである場合も含む)でなければなりません。
全てのコメディ映画(Comedy films)からなるビューを作成します。
CREATE VIEW comedies AS SELECT * FROM films WHERE kind = 'Comedy';
標準SQLのCREATE VIEW文には、さらにいくつかの機能が規定されています。
CREATE VIEW name [ ( column_name [, ...] ) ] AS query [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
このSQLコマンドの全てのオプション句について、次に説明します。
更新される可能性のあるビューには、このオプションを使用しなければなりません。 ビューに対する全てのINSERTとUPDATEコマンドは、ビュー定義の条件を満足しているかどうか(新しいデータがビューを通して可視であるかどうか)検査されます。 条件を満たしていない場合、その更新は拒否されます。
このビューの整合性を検査します。
このビューと依存している全てのビューの整合性を検査します。 CASCADEDまたはLOCALのいずれも指定されていない場合は、CASCADEDとして扱われます。
CREATE OR REPLACE VIEWはPostgreSQLの言語拡張です。 つまり一時ビューという概念も言語拡張です。