【PostgreSQL】 SQL構文(DDL):ビュー(View)

SQL構文(DDL):ビュー(View)とは

複数のテーブルやビューに基づいたクエリの結果を表す仮想テーブルです。実データを持たず、指定されたSELECT文の結果をテーブルのように扱うことができます。

ビューに対して行われた操作(挿入、更新、削除)は、ビューの基になっている元のテーブルに反映されますが、いくつかの条件があります。

  • 更新可能なビュー
    1つのテーブルから取得したものは、データの更新や削除が元のテーブルに反映されます。

  • 更新できないビュー
    JOINや集計関数、DISTINCT、GROUP BY、HAVINGを含むビュー)は、更新操作ができない場合があります。

  • CHECK OPTION
    ビューに対する更新や挿入がビューの条件を満たしている場合にのみ、元のテーブルに反映されます。


ビュー(View)の作成

作成構文


CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW view_name [ ( column_name [, ...] ) ]
AS select_query
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];


構文の説明

  • OR REPLACE
    作成しようとしている名称と同じビューがあれば置き換えます。
  • TEMP | TEMPORARY
    一時ビューを作成します。セッションが終了するとビューは削除されます。
  • view_name
    作成するビューの名称です。

  • column_name
    必要に応じて、ビューの列に任意の名前を指定します。select_queryの列と一致させます。

  • AS select_query
    ビューがどのデータを表示するかを定義するSELECTクエリです。

  • WITH [ CASCADED | LOCAL ] CHECK OPTION
    CASCADED:ビューを操作する際に全ての階層で条件を適用します。(デフォルト)
    LOCAL:直接参照されたビューに対してのみ条件を適用します。

ビュー(View)の作成例

  • 基本的なビューの作成


employeesテーブルの中からHR部門の従業員のみを選択するビューです。

CREATE VIEW employee_view AS
SELECT employee_id, first_name, last_name, department
FROM employees
WHERE department = 'HR';


  • 列名を指定したビューを作成
    SQL中の「first_name || ‘ ‘ || last_name」は、「first_name」と「last_name」をスペースを1個空けて結合しています。つまり「emp_name」はフルネームを示します。

CREATE VIEW dept_view (emp_id, emp_name, dept) AS
SELECT employee_id, first_name || ' ' || last_name, department
FROM employees;


  • 二つ以上のテーブルからビューを作成する
    従業員情報のemployeesテーブルと、部署情報のdepartmentsテーブルを使ったビューを作成します。


CREATE VIEW employee_department_view AS
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;


  • CREATE VIEW employee_department_view AS
    名称「employee_department_view」のビューを作成します。

  • SELECT e.employee_id, e.first_name, e.last_name, d.department_name
    employeesテーブルからemployee_idfirst_namelast_nameを選択し、departmentsテーブルからはdepartment_nameを選択しています。edはテーブルのエイリアス(別名)で、クエリ内で簡潔に記述できるようにしています。

  • FROM employees e
    employeesテーブルをe(別名)で参照しています。

  • JOIN departments d ON e.department_id = d.department_id
    departmentsテーブルをd(別名)で定義し、結合演算子 (JOIN)を使用してemployeesと結合しています。

  • ON e.department_id = d.department_id
    employeesテーブルのdepartment_iddepartmentsテーブルのdepartment_idが一致する行を結合します。



このビューの結果

employeesテーブル

employee_idfirst_namelast_namedepartment_id
1JohnDoe101
2JaneSmith102

departmentsテーブル

department_iddepartment_name
101HR
102IT


ビューを作成した後、下記のSQLを実行すると、

SELECT * FROM employee_department_view;

結果は以下のようになります。

employee_idfirst_namelast_namedepartment_name
1JohnDoeHR
2JaneSmithIT

  


  • ビューの更新可能性とCHECK OPTION
    下記ビューの場合、追加や変更するデータの「status」が「 ‘active’」の場合のみ成功します。「 ‘active’」以外の場合はエラーとなります。
CREATE VIEW active_employees AS
SELECT employee_id, first_name, last_name, status
FROM employees
WHERE status = 'active'
WITH CHECK OPTION;


ビューのオプション

  • TEMPORARY VIEW
    セッションが終了すると、このビューは自動的に削除されます。

CREATE TEMP VIEW temp_employee_view AS
SELECT employee_id, first_name, last_name
FROM employees;


  • CASCADED と LOCAL
    「WITH LOCAL CHECK OPTION」の場合、制限は適用されません。「CASCADED」はデフォルトで制限を適用します。


CREATE VIEW dept_manager_view AS
SELECT department, manager_id
FROM departments
WHERE manager_id IS NOT NULL
WITH LOCAL CHECK OPTION;


ビュー(View)の削除

削除構文


DROP VIEW [ IF EXISTS ] view_name [ CASCADE | RESTRICT ];



構文の説明

  • IF EXISTS:
    「view_name」ビューが存在する場合に削除します。
  • CASCADE
    このビューを参照する他のオブジェクトも一緒に削除します。

  • RESTRICT
    参照するオブジェクトがある場合は削除しません。(デフォルト)

タイトルとURLをコピーしました