ビュー(View)の概要
ビュー(View)は、データベースにおいて物理的なデータを保持しない「仮想的なテーブル」です。その中身は、定義されたSELECTクエリによって動的に生成される結果セットであり、ユーザーは通常のテーブルと同じようにクエリを投げることができます。実体はSQLステートメントであるため、ビューを参照するたびに基底となるテーブルから最新のデータが取得されます。
ビューを利用する主なメリットは以下の通りです。
- 操作の簡略化: 複雑な結合(JOIN)やフィルタリング条件をビューとして定義しておくことで、利用者は背後の複雑な構造を意識せずにシンプルなクエリでデータを取得できます。
- セキュリティの向上: 特定の列や行のみを抽出したビューを作成することで、元のテーブルに含まれる機密性の高いデータへのアクセスを制限し、必要な情報のみを公開できます。
- 論理的な独立性: 基底テーブルの構造が変更(列の追加や名称変更など)された場合でも、ビューの定義を調整するだけで、アプリケーション側のクエリを修正することなく影響を最小限に抑えられます。
ビューの作成および定義の変更
ビューを作成するには、CREATE VIEW文を使用します。既存のビューを上書きする場合は OR REPLACE オプションを付与します。
CREATE [OR REPLACE] VIEW ビュー名 [(カラムリスト)]
AS
SELECT文
[WITH [CASCADED | LOCAL] CHECK OPTION];
WITH CHECK OPTIONは、ビューを通じてデータの更新(INSERT/UPDATE)を行う際、ビューの抽出条件を満たさない変更を禁止する設定です。
- LOCAL: 現在のビューの条件のみをチェックします。
- CASCADED: 依存関係にあるすべてのビューの条件をチェックします(デフォルト値)。
作成例
例えば、products(製品)テーブルとcategories(カテゴリ)テーブルを結合し、製品名とそのカテゴリ名を一括で取得するビュー v_product_info を作成します。
CREATE OR REPLACE VIEW v_product_info
AS
SELECT
p.id AS product_id,
p.name AS product_name,
c.category_name
FROM
products p
INNER JOIN
categories c ON p.category_id = c.id;
作成したビューに対しては、通常のテーブルと同様にSELECT文を実行できます。
SELECT * FROM v_product_info WHERE category_name = 'Electronics';
ビューの変更
定義を変更する場合は、ALTER VIEW文を使用します。構文は CREATE VIEW とほぼ同様です。
ALTER VIEW v_product_info
AS
SELECT
p.id,
p.name,
p.price,
c.category_name
FROM
products p
INNER JOIN
categories c ON p.category_id = c.id;
ビューの確認
MySQLでは、現在のデータベース内に存在するビューを確認するために SHOW TABLES を使用できます。ビューとテーブルが混在して表示されますが、詳細を確認したい場合は以下のコマンドが有効です。
テーブルの種類(BASE TABLEかVIEWか)を含めて表示する場合:
SHOW FULL TABLES;
特定のビューがどのようなSELECT文で定義されているかを確認する場合:
SHOW CREATE VIEW v_product_info;
ビューの削除
不要になったビューを削除するには DROP VIEW 文を使用します。存在しないビューを削除しようとした際のエラーを防ぐために IF EXISTS を付けるのが一般的です。
DROP VIEW IF EXISTS v_product_info;
複数のビューを一度に削除することも可能です。
DROP VIEW view_a, view_b;