MySQL ビューの作成と使用
ビューとは仮想テーブルのことであり、複雑なクエリをシンプルなインターフェースにまとめ上げたものです。
このレッスンでは、ビューの作成、使用、および管理について解説します。
graph TB
A[How Views Work] --> B[CREATE VIEW DefinitionSQL]
B --> C[StorageSQLDefinition]
C --> D[When querying a view]
D --> E[Expand to the bottom layerSQL]
E --> F[Execute a query on the underlying table]
F --> G[Return Results]
B --> H[WITH CHECK OPTION]
H --> I[When modifying data<br/>Validate View Conditions]
1. 学習内容
- CREATE VIEW:ビューを作成する
- ビューとテーブルの違い
- ビューの変更と削除
- ビューのユースケース
- チェックオプション付き
2. 実際の事例
(1) 課題:複雑なクエリを繰り返し作成すること
「アクティブな顧客の注文統計」を照会する必要がよくありますが、SQLクエリが非常に長くなってしまいます:
SQL
SELECT c.name, COUNT(o.id), SUM(o.amount)
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE c.status = 'active'
GROUP BY c.id;
毎回書き出さなければならない。
(2) 表示に関する問題の解決策
SQL
CREATE VIEW active_customer_orders AS
SELECT c.name, COUNT(o.id) AS order_count, SUM(o.amount) AS total_amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE c.status = 'active'
GROUP BY c.id;
-- Query the view directly in the future
SELECT * FROM active_customer_orders;
3. ビューの作成
▶ 例:基本ビュー
SQL
-- Create a View
CREATE VIEW v_active_users AS
SELECT id, username, email, created_at
FROM users
WHERE status = 'active';
-- Using Views(Query like a table)
SELECT * FROM v_active_users;
SELECT * FROM v_active_users WHERE created_at >= '2026-01-01';
▶ 例:複雑なビュー
SQL
-- Order Statistics View
CREATE VIEW v_order_stats AS
SELECT
c.id AS customer_id,
c.name AS customer_name,
COUNT(o.id) AS total_orders,
SUM(o.amount) AS total_amount,
AVG(o.amount) AS avg_amount,
MAX(o.order_date) AS last_order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id, c.name;
4. ビューとテーブル
| 次元 | ビュー | テーブル |
|---|---|---|
| データ保存 | 保存なし(仮想) | 実際のデータを保存 |
| 更新 | 制限事項(シンプルビューで更新可能) | 自由に追加・削除・変更可能 |
| パフォーマンス | クエリごとに再計算 | 直接読み取り |
| 目的 | クエリとアクセス制御を簡素化する | データを保存する |
5. ビューの変更と削除
▶ 例:管理画面
SQL
-- Edit View
ALTER VIEW v_active_users AS
SELECT id, username, email, phone, created_at
FROM users
WHERE status = 'active' AND email_verified = TRUE;
-- or use CREATE OR REPLACE
CREATE OR REPLACE VIEW v_active_users AS
SELECT id, username, email FROM users WHERE status = 'active';
-- Delete View
DROP VIEW IF EXISTS v_active_users;
-- View View Definition
SHOW CREATE VIEW v_active_users;
6. CHECK オプション付き
ビューを通じて変更されたデータが、依然としてそのビューの条件を満たしていることを確認してください。
▶ 例:CHECK OPTION
SQL
CREATE VIEW v_active_users AS
SELECT * FROM users WHERE status = 'active'
WITH CHECK OPTION;
-- Allowed: status is active
UPDATE v_active_users SET username = 'new_name' WHERE id = 1;
-- Prohibited: After the revision status is no longer active, will be rejected
UPDATE v_active_users SET status = 'inactive' WHERE id = 1;
-- ERROR: CHECK OPTION failed
7. ビューのユースケース
| シナリオ | 説明 |
|---|---|
| 複雑なクエリを簡略化する | 複数テーブルのJOINをカプセル化し、シンプルなインターフェースを提供する |
| アクセス制御 | ユーザーには選択したフィールドのみを表示する |
| データの抽象化 | 基となるテーブル構造の変更を隠蔽する |
| レポート統計 | 定義済み統計ロジック |
▶ 例:アクセス制御
SQL
-- Create a view that contains only public information
CREATE VIEW v_user_public AS
SELECT id, username, avatar FROM users;
-- Grant only view permissions to regular users
GRANT SELECT ON mydb.v_user_public TO 'readonly_user'@'localhost';
❓ よくある質問
Q ビューにインデックスを作成することはできますか?
A いいえ。ビューは、実際のストレージを持たない仮想テーブルです。ビューに対するクエリの最適化は、基になるテーブルのインデックスに依存しています。
Q ビューはネストできますか?
A はい、
CREATE VIEW v2 AS SELECT * FROM v1。ただし、過度なネストはパフォーマンスに影響を与える可能性があります。Q ビューのデータはリアルタイムですか?
A はい。ビューはクエリが実行されるたびに基となるテーブルから再計算されるため、最新のデータが表示されます。
Q ビューはストレージ容量を消費しますか?
A いいえ、消費しません。ビューにはSQL定義のみが格納され、実際のデータは格納されません。
Q ビューはパフォーマンスを向上させることができますか?
A いいえ。ビューは単なる構文上の簡略化に過ぎず、クエリが実行されるたびに、その背後にあるSQLが再実行されます。パフォーマンスの最適化は、インデックスに依存すべきです。
📖 まとめ
- ビューは、データを格納しない仮想テーブルであり、クエリが実行されるたびに再計算されます。
- CREATE VIEW で作成、ALTER VIEW で変更、DROP VIEW で削除
- チェックオプション付き 変更内容がビューの条件を満たしていることを確認します
- 用途:簡素化されたクエリ、アクセス制御、データ抽象化、レポート作成および分析
📝 練習問題
-
基本問題(難易度:⭐):アクティブなユーザーのID、ユーザー名、メールアドレスのみを表示するビューを作成してください。
-
上級演習(難易度:⭐⭐):顧客名、注文数、合計金額を含む注文統計ビューを作成してください。
-
課題(難易度:⭐⭐⭐):ビューを使用してアクセス制御を実装する。読み取り専用のビューを作成し、特定のユーザーにアクセス権を付与する。



