0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【MySQL】ビュー(VIEW)をどのような場面で使うか

0
Posted at

1. 概要 / 結論

  • MySQLのビュー(VIEW)の概念、利用するメリット、具体的なユースケースについての備忘録。
  • ビューは実体を持たない「仮想テーブル」であり、「複雑なSQLの共通化」「アクセス制御によるセキュリティ向上」「DB構造変更の隠蔽」を目的に利用するのが最適。

2. 課題・背景(なぜ調べたか)

  • テーブル設計やSQL開発において「いつビューを使うべきか」「実テーブルと何が違うのか」といった仕様や活用場面を整理したかったため。

3. 実装・解決方法 / 使い方

主な活用ユースケース

  1. 複雑なSQL(JOIN・集計等)の共通化

    • 複数テーブルの結合や集計処理を定義しておくことで、毎回長いSQLを書く必要がなくなる。
  2. セキュリティ・アクセス制御

    • テーブル内の特定のカラム(個人情報や機密情報など)を除外したビューを作成し、特定のユーザーにはそのビューのみの参照権限を与える。
  3. テーブル構造変更の隠蔽(疎結合化)

    • アプリケーション側がビューを参照するようにしておけば、DBのテーブル分割やスキーマ変更があってもビュー定義の更新のみで影響を抑えられる。
  4. BIツール・レポート出力の簡略化

    • 分析ツールやExcel等と連携する際、DB側で統一されたデータソースとして提供できる。

基本構文とコード例

① ビューの作成

-- ユーザーと注文情報を結合し、完了済みの注文のみを抽出するビュー
CREATE VIEW v_completed_orders AS
SELECT 
    u.id AS user_id, 
    u.name AS user_name, 
    o.id AS order_id, 
    o.total_amount, 
    o.created_at
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed';

② ビューの参照(通常のテーブル同様に呼び出し)

SELECT * FROM v_completed_orders;

③ ビューの更新・置き換え

CREATE OR REPLACE VIEW v_completed_orders AS
SELECT 
    u.id AS user_id, 
    u.name AS user_name, 
    u.email,
    o.id AS order_id, 
    o.total_amount, 
    o.created_at
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed';

④ ビューの削除

DROP VIEW IF EXISTS v_completed_orders;

4. はまりポイント・注意点

  • パフォーマンス低下リスク:
    • ビューはデータ自体を保持していないため、参照のたびに内部で元となるSELECT文が実行される。元のクエリが重い場合やネストしたビューを作成すると低速化の原因になる。
  • データ更新の制限(更新不可なビュー):
    • JOINを含むビューや、GROUP BY・SUM()・COUNT()などの集計関数を使用しているビュー経由でのデータ操作(INSERT / UPDATE / DELETE)は基本的にできない。
    • 基本的には「参照専用(READ ONLY)」として運用するのが安全。

5. 参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?