404 Not Found

404 Not Found


nginx

MySQL ビューの作成と使用

ビューとは仮想テーブルのことであり、複雑なクエリをシンプルなインターフェースにまとめ上げたものです。

このレッスンでは、ビューの作成、使用、および管理について解説します。

100%
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. 学習内容


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が再実行されます。パフォーマンスの最適化は、インデックスに依存すべきです。

📖 まとめ


📝 練習問題

  1. 基本問題(難易度:⭐):アクティブなユーザーのID、ユーザー名、メールアドレスのみを表示するビューを作成してください。

  2. 上級演習(難易度:⭐⭐):顧客名、注文数、合計金額を含む注文統計ビューを作成してください。

  3. 課題(難易度:⭐⭐⭐):ビューを使用してアクセス制御を実装する。読み取り専用のビューを作成し、特定のユーザーにアクセス権を付与する。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%