Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

VIEW

ビューは SELECT 文の結果に名前を付けて仮想テーブルとして扱う仕組みです。複雑なクエリを再利用したり、特定の列だけ公開してアクセスを制限したりするときに使います。

構文
-- ビューを作成します。
CREATE VIEW ビュー名 AS
SELECT ...;

-- 既存ビューがあれば置き換えます(MySQL・PostgreSQL)。
CREATE OR REPLACE VIEW ビュー名 AS
SELECT ...;

-- ビューを削除します。
DROP VIEW ビュー名;

-- ビューが存在する場合のみ削除します。
DROP VIEW IF EXISTS ビュー名;
構文一覧
構文概要
CREATE VIEWSELECT文を元にビューを作成します。以降は通常のテーブルと同様に SELECT で参照できます。
CREATE OR REPLACE VIEWビューが存在しなければ作成し、存在すれば定義を置き換えます。
DROP VIEWビューを削除します。元テーブルのデータには影響しません。
DROP VIEW IF EXISTSビューが存在する場合のみ削除します。存在しない場合もエラーになりません。
サンプルコード
-- アクティブな会員と注文情報を結合したビューを作成します。
CREATE OR REPLACE VIEW v_active_member_orders AS
SELECT
    m.member_id,
    m.name        AS member_name,
    o.order_id,
    o.total,
    o.ordered_at
FROM members m
JOIN orders o ON m.member_id = o.member_id
WHERE m.status = 'active';

-- ビューを通常のテーブルと同様に使用します。
SELECT member_name, SUM(total) AS total_amount
FROM v_active_member_orders
GROUP BY member_id, member_name
ORDER BY total_amount DESC;

-- 給与情報を除外した社員ビューを作成します(アクセス制限)。
CREATE VIEW v_employees_public AS
SELECT employee_id, name, department
FROM employees;

-- ビューを削除します。
DROP VIEW IF EXISTS v_active_member_orders;
実行結果
-- SELECT member_name, SUM(total) AS total_amount FROM v_active_member_orders
-- GROUP BY member_id, member_name ORDER BY total_amount DESC; の結果例
-- +----------+--------------+
-- | member_name | total_amount |
-- +----------+--------------+
-- | 田中太郎 |       158000 |
-- | 鈴木花子 |        89500 |
-- | 山田次郎 |        42000 |
-- +----------+--------------+
データベース別の書き方

『CREATE VIEW』『DROP VIEW』は標準SQLであり、MySQL・PostgreSQL・Oracle・SQL Server・SQLite で共通して使用できます。

CREATE VIEW v_employees_public AS
SELECT employee_id, name, department
FROM employees;

DROP VIEW IF EXISTS v_employees_public;

『CREATE OR REPLACE VIEW』は MySQL・PostgreSQL・Oracle で使用できます。SQL Server では『ALTER VIEW』で定義を変更します。

-- ビューの定義を変更します(SQL Server)。
ALTER VIEW v_employees_public AS
SELECT employee_id, name, department, hire_date
FROM employees;

SQLite では『CREATE OR REPLACE VIEW』はサポートされていません。既存のビューを削除してから再作成します。

-- ビューを再作成します(SQLite)。
DROP VIEW IF EXISTS v_employees_public;
CREATE VIEW v_employees_public AS
SELECT employee_id, name, department
FROM employees;
概要

ビューは実際のデータを持たず、参照されるたびに内部の SELECT 文が実行されます。そのため「仮想テーブル」と呼ばれます。複雑な JOIN や集計を含むクエリをビューにまとめておくと、アプリケーション側の SQL を簡潔に保てます。

単純なビューは通常、INSERT・UPDATE・DELETE も実行できます(更新可能ビュー)。ただし、集計関数・DISTINCT・GROUP BY・UNION などを含む複雑なビューは読み取り専用となります。

再帰処理や一時的な名前付きクエリには『WITH(CTE)』も活用できます。SELECTの基本は『SELECT』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。