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_id
、first_name
、last_name
を選択し、departments
テーブルからはdepartment_name
を選択しています。e
やd
はテーブルのエイリアス(別名)で、クエリ内で簡潔に記述できるようにしています。 - 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_id
とdepartments
テーブルのdepartment_id
が一致する行を結合します。
このビューの結果employees
テーブル
employee_id | first_name | last_name | department_id |
---|---|---|---|
1 | John | Doe | 101 |
2 | Jane | Smith | 102 |
departments
テーブル
department_id | department_name |
---|---|
101 | HR |
102 | IT |
ビューを作成した後、下記のSQLを実行すると、
SELECT * FROM employee_department_view;
結果は以下のようになります。
employee_id | first_name | last_name | department_name |
---|---|---|---|
1 | John | Doe | HR |
2 | Jane | Smith | IT |
- ビューの更新可能性と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
参照するオブジェクトがある場合は削除しません。(デフォルト)