言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. SQL辞典
  3. VIEW

VIEW

対応: SQL-92(1992)

ビューは 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ビューが存在する場合のみ削除します。存在しない場合もエラーになりません。

サンプルコード

以下の『members』テーブルと『orders』テーブルを例に説明します。

members member_id name status 1 綾波レイ active 2 碇シンジ active 3 惣流アスカ inactive 3 rows in set

orders order_id member_id total ordered_at 101 1 58000 2025-01-15 102 2 89500 2025-02-03 103 1 100000 2025-03-22 3 rows in set

アクティブな会員と注文情報を結合したビューを作成します。

sample_view.sql
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';
Query OK, 0 rows affected

ビューを通常のテーブルと同様に使用します。

sample_view.sql
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 |
+-------------+--------------+
2 rows in set

アクティブな会員のみを絞り込んだビューを作成します(アクセス制限)。

sample_view.sql
CREATE VIEW v_active_members AS
SELECT member_id, name
FROM members
WHERE status = 'active';
Query OK, 0 rows affected
SELECT * FROM v_active_members;
+-----------+------------+
| member_id | name       |
+-----------+------------+
|         1 | 綾波レイ   |
|         2 | 碇シンジ   |
+-----------+------------+
2 rows in set

ビューを削除します。

sample_view.sql
DROP VIEW IF EXISTS v_active_member_orders;
Query OK, 0 rows affected

データベース別の書き方

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

CREATE VIEW v_active_members AS
SELECT member_id, name
FROM members
WHERE status = 'active';

DROP VIEW IF EXISTS v_active_members;

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

-- ビューを再作成します(SQLite)。
DROP VIEW IF EXISTS v_active_members;
CREATE VIEW v_active_members AS
SELECT member_id, name
FROM members
WHERE status = 'active';

概要

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

ビューに対して INSERT や UPDATE を実行できる場合があり、これを更新可能ビューと呼びます。単純なビューは通常、INSERT・UPDATE・DELETE も実行できます。ただし、集計関数・DISTINCT・GROUP BY・UNION などを含む複雑なビューは読み取り専用となります。

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

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