 |
PSQL Programmer's Guide (v11) |
 |
|
ビュー (リレーショナル インターフェイス)
ビューは、データベース内のデータを調べるためのメカニズムです。複数のテーブルのデータを結合したり、1 つのテーブルの特定の列だけを含めたりすることができます。ビューはテーブルに似ていますが、データベースのテーブルの列に基づいて選択した一連の列または計算結果から構成されています。したがって、ビューには、複数のテーブル内の列からのデータ、または実際にテーブル内にまったくないデータ、たとえば、SELECT COUNT(*)FROM Person などが含まれている場合があります。
ビューの機能
以下に、ビューのいくつかの機能を示します。
- ビューの列は、可変長の列が最後の列でなければならないということ以外、任意の順序で配列することができます。可変長の列は 1 つしか指定できません。
- 制限句を使用して、Pervasive PSQL がビューに返す行のセットを指定できます。制限句は、データをビューに取り込む必要のある条件を指定します。詳細については、制限句 (リレーショナル インターフェイス)を参照してください。
- データベースにアクセスするユーザーとアプリケーションごとに、ビューの設計とカスタマイズが行えます。これらのビューの定義は、後で呼び出すためにデータ辞書に格納できます。
- ビューが読み取り専用のビューでない限り、データを取得、更新、または削除する際に、テーブル リストにストアド ビュー名をいくつでも含めることができます。読み取り専用のビューでは、データの取得しか行えません。
- ストアド ビューでは、ビューの計算列と定数に見出しを付け、ビューからデータを取得するときにこれらの見出しの名前を列名のリストで使用しなければなりません。
テンポラリ ビューとストアド ビュー
SELECT ステートメントを使用して、テンポラリ ビューまたはストアド ビューを作成できます。テンポラリ ビューは 1 回だけ使用して、その後で解放するものです。Pervasive PSQL はストアド ビューの定義をデータ辞書(X$Proc)に保管するので、後でそのビューを呼び出すことができます。CREATE VIEW ステートメントを使用すると、ストアド ビューの作成と名前付けが行えます。
各ビューはデータベース内で一意であり、また 20 文字を超えることはできません。ビューに名前を付ける規則の詳細については、第 14 章 データの挿入と削除を参照してください。
Pervasive PSQL は、データベース要素名を定義する場合に大文字と小文字を区別します。PhoNE という名前のストアド ビューを作成すると、Pervasive PSQL は辞書にビュー名を PhoNE として格納します。ビュー名の定義後、Pervasive PSQL は大文字小文字を区別しません。ストアド ビュー PhoNE を定義した後、そのビューを phone で参照することができます。
ストアド ビューを使用すると、以下の機能が実現します。
- 頻繁に実行するクエリを格納し、後で使用するために名前を付けることができます。以下の例では、Department テーブルに基づいて Phones というストアド ビューを作成します。
CREATE VIEW Phones (PName, PPhone)
AS SELECT Name, Phone_Number
FROM Department#
- データの取得、更新および削除を行う場合、テーブル リストでストアド ビューの名前を指定できます。ストアド ビューはデータベース内のテーブルであるかのように動作しますが、実際には使用する都度、Pervasive PSQL エンジンによって内部で再構築されます。以下の例では、ストアド ビュー Phones を参照することによって、Department テーブル内の History Department の電話番号を更新します。
UPDATE Phones
SET PPhone = '5125552426'
WHERE PName = 'History'#
- 見出しを指定できます。見出しでは、辞書の列に対して定義した名前とは異なる列名を指定します。以下の例では、ストアド ビュー Phones に見出し Department と Telephone を指定します。
CREATE VIEW Dept_Phones (Department, Telephone)
AS SELECT Name, Phone_Number
FROM Department#
- 以下の例に示すように、ビューの以降のクエリ内で見出しを使用できます。
SELECT Telephone
FROM Dept_Phones#
- 選択リストに単純な列名が含まれている場合に、見出しを指定しないと、Pervasive PSQL はその列名を列の見出しとして使用します。
- ビューに含める定数と計算列に名前を付けるには、見出しを使用する必要があります。以下の例では、見出し Student と Total を作成します。
CREATE VIEW Accounts (Student, Total)
AS SELECT Student_ID, SUM (Amount_Paid)
FROM Billing
GROUP BY Student_ID#
- 重複する列名を持つ複数のテーブルから SELECT * を指定する場合にも、見出しを使用しなければなりません。
- データベースにアクセスするユーザーまたはアプリケーションごとに、カスタマイズされたビューを作成できます。これらのビューの定義は、後で呼び出すためにデータ辞書に格納できます。
ビューの読み取り専用テーブル
読み取り専用のテーブルを含んでいるビューの行を挿入、更新、または削除することはできません。(ここでいう「更新」は、挿入、更新、および削除を指します。テーブルが読み取り専用ならば、テーブルを更新できません。)テーブルの中には、読み取り専用と指定されているビュー内にあるかどうかにかかわらず、読み取り専用のものがあります。そのようなテーブルは本質的に読み取り専用であり、更新できません。テーブルが以下の基準のうちのいずれかを満たした場合、そのテーブルは読み取り専用です。
- データベースはセキュリティが有効で、現在のユーザーまたはユーザー グループはデータベースまたはテーブルに定義されている SELECT 権しかありません。
- データ ファイルには、たとえば、DOS または Windows の ATTRIB コマンドや Linux の chmod コマンドを使用して、物理ファイル レベルで読み取り専用のフラグが付けられています。
- ビューを作成して以下の項目を組み込む SELECT 句を実行します。
- 選択リストの集計関数
- GROUP BY 句または HAVING 句
- UNION
- DISTINCT キーワード
- ビューを作成する SELECT ステートメントを実行すると、テーブルには以下の特性が組み込まれます。
- テーブルは、SELECT ステートメントの FROM 句にあるマージできないビューに表示されます。
- テーブルはシステム テーブルです。たとえ読み取り専用モードがビューのオープン モードを無効にする場合でも、システム テーブルは常にビュー内で読み取り専用として開かれます。
- テーブルからの列が計算列に現れるか、スカラー関数が選択リストに現れます。
- テーブルは、最も外側のクエリと相関関係を持たないサブクエリの FROM 句に現れます。サブクエリは、最も外側のクエリと直接または間接に相関関係を持たせることができます。サブクエリは、もしテーブルから列への参照が含まれており、最も外側の FROM 句中に、その特定の発生がある場合、最も外側のクエリと直接相関関係を持ちます。サブクエリは、あるサブクエリと相関関係があって、そのサブクエリが最も外側のクエリと直接または間接に相関関係がある場合に、最も外側のクエリと間接的に相関関係があります。
- オープン モードは読み取り専用です。
- FOR UPDATE を指定せずに、以下のキーワードで位置付け UPDATE ステートメントを実行します。
-
ORDER BY
-
SCROLL
マージ可能なビュー
ビューは、ベース テーブルと列だけを使用して SELECT ステートメントを書き換えることができる場合にマージ可能です。
たとえば、何人の学生が 1 クラスにいるかを知りたい場合、それを計算するビューを定義できます。以下のようにビュー NumberPerClass を定義します。
CREATE VIEW NumberPerClass (Class_Name, Number_of_Students)
AS SELECT Name, COUNT(Last_Name)
FROM Person, Class, Enrolls
WHERE Person.ID = Enrolls.Student_ID
AND Class.ID = Enrolls.Class_ID
GROUP BY Name#
以下のようにビュー NumberPerClass を定義します。
SELECT *
FROM NumberPerClass#
この場合、ビュー NumberPerClass がマージ可能なのは、以下のように SELECT ステートメントを書き換えることができるからです。
SELECT Name, COUNT(Last_Name)
FROM Person, Class, Enrolls
WHERE Person.ID = Enrolls.Student_ID
AND Class.ID = Enrolls.Class_ID
GROUP BY NAME#
以下のように SELECT ステートメントを書きたい場合、ビュー NumberPerClass はマージ不能です。
SELECT COUNT(Name)
FROM NumberPerClass
WHERE Number_of_Students > 50#
このステートメントは、ビュー NumberPerClass に対して無効です。ベース テーブルとベース 列だけでは、このビューを書き換えることができません。
ビューに以下の特性が含まれていない場合、ビューはマージ可能です。
- ビューがマージ不能なビューを参照する。
- ビューが選択リスト内に集計関数を持つか、DISTINCT キーワードを持っており、また、選択リスト内に集計を持つ SELECT ステートメントの FROM 句に現れる。
- ビューが DISTINCT キーワードを持ち、SELECT ステートメントの FROM 句に現れるが、そのステートメントはその FROM 句の中に複数の項目があり、その選択リストに集計を持たず、かつ DISTINCT キーワードを持っていない。
- ビューがその選択リストに集計を持ち、SELECT ステートメントの FROM 句に現れるが、そのステートメントはその FROM 句の中に複数の項目があるか、または WHERE 句の制限がある。
 データ取得の概要 (リレーショナル インターフェイス) |
 選択リスト (リレーショナル インターフェイス) |
|