VIEW
| 対応: | SQL-92(1992) |
|---|
ビューは SELECT 文の結果に名前を付けて仮想テーブルとして扱う仕組みです。複雑なクエリを再利用したり、特定の列だけ公開してアクセスを制限したりするときに使います。
構文
ビューを作成します。
CREATE VIEW ビュー名 AS SELECT ...;
既存ビューがあれば置き換えます(MySQL・PostgreSQL)。
CREATE OR REPLACE VIEW ビュー名 AS SELECT ...;
ビューを削除します。
DROP VIEW ビュー名;
ビューが存在する場合のみ削除します。
DROP VIEW IF EXISTS ビュー名;
構文一覧
| 構文 | 概要 |
|---|---|
| CREATE VIEW | SELECT文を元にビューを作成します。以降は通常のテーブルと同様に SELECT で参照できます。 |
| CREATE OR REPLACE VIEW | ビューが存在しなければ作成し、存在すれば定義を置き換えます。 |
| DROP VIEW | ビューを削除します。元テーブルのデータには影響しません。 |
| DROP VIEW IF EXISTS | ビューが存在する場合のみ削除します。存在しない場合もエラーになりません。 |
サンプルコード
以下の『members』テーブルと『orders』テーブルを例に説明します。
アクティブな会員と注文情報を結合したビューを作成します。
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』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。