<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=MySQL_-_VIEW</id>
	<title>MySQL - VIEW - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=MySQL_-_VIEW"/>
	<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=MySQL_-_VIEW&amp;action=history"/>
	<updated>2026-04-17T18:59:11Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://mochiu.net/index.php?title=MySQL_-_VIEW&amp;diff=14291&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == MySQLのVIEW (ビュー) は、1つ以上のテーブルから導出される仮想的なテーブルである。&lt;br&gt; VIEWは、SELECT文の結果に名前を付けて保存したもので、実データを持たず、クエリ定義のみを格納する。&lt;br&gt; &lt;br&gt; VIEWを使用することで、複雑なクエリの簡素化、セキュリティの向上、データ抽象化が実現できる。&lt;br&gt; アプリケーションは、VIEWを通常のテー…」</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=MySQL_-_VIEW&amp;diff=14291&amp;oldid=prev"/>
		<updated>2026-02-15T08:29:11Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == MySQLのVIEW (ビュー) は、1つ以上のテーブルから導出される仮想的なテーブルである。&amp;lt;br&amp;gt; VIEWは、SELECT文の結果に名前を付けて保存したもので、実データを持たず、クエリ定義のみを格納する。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; VIEWを使用することで、複雑なクエリの簡素化、セキュリティの向上、データ抽象化が実現できる。&amp;lt;br&amp;gt; アプリケーションは、VIEWを通常のテー…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
MySQLのVIEW (ビュー) は、1つ以上のテーブルから導出される仮想的なテーブルである。&amp;lt;br&amp;gt;&lt;br /&gt;
VIEWは、SELECT文の結果に名前を付けて保存したもので、実データを持たず、クエリ定義のみを格納する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
VIEWを使用することで、複雑なクエリの簡素化、セキュリティの向上、データ抽象化が実現できる。&amp;lt;br&amp;gt;&lt;br /&gt;
アプリケーションは、VIEWを通常のテーブルと同様に扱うことができ、SELECT文でデータを取得できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
MySQLでは、VIEWの作成、変更、削除、確認のための構文が提供されている。&amp;lt;br&amp;gt;&lt;br /&gt;
また、条件を満たすVIEWは更新可能ビュー (Updatable View) として動作し、&amp;lt;code&amp;gt;INSERT&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt; 操作が可能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
VIEWには、MERGE (マージ) と TEMPTABLE (テンポラリテーブル) の2つのアルゴリズムがあり、MySQLが自動的に選択するか、明示的に指定できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;MERGEアルゴリズムはVIEWの定義をクエリに統合してパフォーマンスに優れるが、TEMPTABLEアルゴリズムは一時テーブルを使用するため更新不可となる。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
VIEWは、アクセス制御、複雑なJOINの簡素化、計算列の提供、テーブル構造の変更からアプリケーションを保護する目的で使用される。&amp;lt;br&amp;gt;&lt;br /&gt;
ただし、MySQLにはマテリアライズドビュー (実体化ビュー) が存在しないため、集計結果をキャッシュする場合はテーブルとトリガーで代替する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
VIEWには、参照できるテーブル数 (最大61個)、インデックス作成不可、ビュー定義で使用されているテーブルの変更によるビュー無効化等の制限事項がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VIEWの作成 ==&lt;br /&gt;
==== 基本構文 ====&lt;br /&gt;
VIEWを作成するには、&amp;lt;code&amp;gt;CREATE VIEW&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW &amp;lt;ビュー名&amp;gt; AS&lt;br /&gt;
 SELECT &amp;lt;列名 1&amp;gt;, &amp;lt;列名 2&amp;gt;, ...&lt;br /&gt;
 FROM &amp;lt;テーブル名&amp;gt;&lt;br /&gt;
 WHERE &amp;lt;条件式&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
基本的なVIEWの作成を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW active_users AS&lt;br /&gt;
 SELECT user_id, username, email&lt;br /&gt;
 FROM users&lt;br /&gt;
 WHERE status = &amp;#039;active&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* 複数テーブルのJOINを含むVIEWの作成例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW order_details AS&lt;br /&gt;
 SELECT o.order_id, o.order_date, c.customer_name, p.product_name, o.quantity&lt;br /&gt;
 FROM orders o&lt;br /&gt;
 JOIN customers c ON o.customer_id = c.customer_id&lt;br /&gt;
 JOIN products p ON o.product_id = p.product_id;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 計算列を含むVIEWの作成例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW product_summary AS&lt;br /&gt;
 SELECT product_id, product_name, price, stock,&lt;br /&gt;
        price * stock AS total_value&lt;br /&gt;
 FROM products;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 列名の指定 ====&lt;br /&gt;
VIEWの列名を明示的に指定することができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW &amp;lt;ビュー名&amp;gt; (&amp;lt;列名 1&amp;gt;, &amp;lt;列名 2&amp;gt;, &amp;lt;列名 3&amp;gt;) AS&lt;br /&gt;
 SELECT &amp;lt;列名 1&amp;gt;, &amp;lt;列名 2&amp;gt;, &amp;lt;列名 3&amp;gt;&lt;br /&gt;
 FROM &amp;lt;テーブル名&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
列名を指定する場合は、SELECT文の列数と一致する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW user_info (id, name, mail) AS&lt;br /&gt;
 SELECT user_id, username, email&lt;br /&gt;
 FROM users;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
列名を省略した場合は、SELECT文の列名がそのまま使用される。&amp;lt;br&amp;gt;&lt;br /&gt;
ただし、計算列や重複列名がある場合は、列名を明示的に指定する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW total_sales (year, month, total) AS&lt;br /&gt;
 SELECT YEAR(order_date), MONTH(order_date), SUM(amount)&lt;br /&gt;
 FROM orders&lt;br /&gt;
 GROUP BY YEAR(order_date), MONTH(order_date);&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== OR REPLACEオプション ====&lt;br /&gt;
OR REPLACEオプションを使用すると、既存のVIEWがある場合は置き換え、存在しない場合は新規作成される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE OR REPLACE VIEW &amp;lt;ビュー名&amp;gt; AS&lt;br /&gt;
 SELECT &amp;lt;列名 1&amp;gt;, &amp;lt;列名 2&amp;gt;&lt;br /&gt;
 FROM &amp;lt;テーブル名&amp;gt;&lt;br /&gt;
 WHERE &amp;lt;条件式&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;code&amp;gt;CREATE OR REPLACE VIEW&amp;lt;/code&amp;gt; は、&amp;lt;code&amp;gt;DROP VIEW&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;CREATE VIEW&amp;lt;/code&amp;gt; を組み合わせた操作と同等であるが、アトミックに実行される。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE OR REPLACE VIEW active_users AS&lt;br /&gt;
 SELECT user_id, username, email, created_at&lt;br /&gt;
 FROM users&lt;br /&gt;
 WHERE status = &amp;#039;active&amp;#039; AND deleted_at IS NULL;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ALGORITHMオプション ====&lt;br /&gt;
ALGORITHMオプションにより、VIEWの処理方法を指定できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE&lt;br /&gt;
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]&lt;br /&gt;
    VIEW &amp;lt;ビュー名&amp;gt; AS&lt;br /&gt;
    SELECT ...;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ ALGORITHMオプション&lt;br /&gt;
! アルゴリズム !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| UNDEFINED (デフォルト)&lt;br /&gt;
|&lt;br /&gt;
* MySQLが自動的にMERGEまたはTEMPTABLEを選択する&lt;br /&gt;
* 可能な限りMERGEを使用し、不可能な場合はTEMPTABLEを使用する&lt;br /&gt;
|-&lt;br /&gt;
| MERGE&lt;br /&gt;
|&lt;br /&gt;
* VIEWの参照をVIEW定義で置き換えて基底テーブルと結合する&lt;br /&gt;
* 基底テーブルのインデックスが使用可能&lt;br /&gt;
* パフォーマンスに優れる&lt;br /&gt;
* 更新可能ビューとして動作する可能性がある&lt;br /&gt;
|-&lt;br /&gt;
| TEMPTABLE&lt;br /&gt;
|&lt;br /&gt;
* VIEWの結果を一時テーブルに格納してから処理する&lt;br /&gt;
* 基底テーブルのインデックスは使用不可&lt;br /&gt;
* GROUP BY、DISTINCT、UNION、サブクエリ等を含む場合に使用される&lt;br /&gt;
* 更新不可&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
MERGEアルゴリズムを明示的に指定する例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE ALGORITHM=MERGE VIEW simple_view AS&lt;br /&gt;
 SELECT user_id, username&lt;br /&gt;
 FROM users&lt;br /&gt;
 WHERE status = &amp;#039;active&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
TEMPTABLEアルゴリズムが必要な場合の例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE ALGORITHM=TEMPTABLE VIEW aggregated_view AS&lt;br /&gt;
 SELECT product_id, COUNT(*) AS order_count, SUM(quantity) AS total_qty&lt;br /&gt;
 FROM orders&lt;br /&gt;
 GROUP BY product_id;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下のクエリ要素を含むVIEWは、MERGEアルゴリズムを使用できない。&amp;lt;br&amp;gt;&lt;br /&gt;
* 集約関数 (SUM、COUNT、MAX、MIN、AVG)&lt;br /&gt;
* DISTINCT&lt;br /&gt;
* GROUP BY&lt;br /&gt;
* HAVING&lt;br /&gt;
* UNION / UNION ALL&lt;br /&gt;
* サブクエリ (SELECT リスト内)&lt;br /&gt;
* ユーザ定義変数への代入&lt;br /&gt;
* LIMITとOFFSETの組み合わせ&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== DEFINER句 と SQL SECURITY句 ====&lt;br /&gt;
&amp;lt;code&amp;gt;DEFINER&amp;lt;/code&amp;gt; 句 と &amp;lt;code&amp;gt;SQL SECURITY&amp;lt;/code&amp;gt; 句により、VIEWのアクセス権チェック方法を制御できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE&lt;br /&gt;
    [DEFINER = &amp;lt;ユーザ名@ホスト名&amp;gt;]&lt;br /&gt;
    [SQL SECURITY { DEFINER | INVOKER }]&lt;br /&gt;
    VIEW &amp;lt;ビュー名&amp;gt; AS&lt;br /&gt;
    SELECT ...;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ DEFINER句とSQL SECURITY句&lt;br /&gt;
! オプション !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| DEFINER = user@host&lt;br /&gt;
|&lt;br /&gt;
* VIEWの所有者を指定する&lt;br /&gt;
* 省略時は、VIEWを作成したユーザが設定される&lt;br /&gt;
* SUPER権限を持つユーザは、他のユーザを指定できる&lt;br /&gt;
|-&lt;br /&gt;
| SQL SECURITY DEFINER (デフォルト)&lt;br /&gt;
|&lt;br /&gt;
* VIEWのDEFINERの権限でアクセス権をチェックする&lt;br /&gt;
* VIEWを呼び出したユーザの権限に関係なく、DEFINERの権限で実行される&lt;br /&gt;
* セキュリティ制御に有用&lt;br /&gt;
|-&lt;br /&gt;
| SQL SECURITY INVOKER&lt;br /&gt;
|&lt;br /&gt;
* VIEWを呼び出したユーザの権限でアクセス権をチェックする&lt;br /&gt;
* VIEWを実行するユーザが基底テーブルへのアクセス権を持つ必要がある&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* DEFINER権限でアクセス制御を行う例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE DEFINER = admin@localhost&lt;br /&gt;
 SQL SECURITY DEFINER&lt;br /&gt;
 VIEW public_users AS&lt;br /&gt;
 SELECT user_id, username&lt;br /&gt;
 FROM users;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* INVOKER権限でアクセス制御を行う例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE SQL SECURITY INVOKER VIEW my_data AS&lt;br /&gt;
 SELECT *&lt;br /&gt;
 FROM sensitive_table&lt;br /&gt;
 WHERE user_id = CURRENT_USER();&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VIEWの変更 ==&lt;br /&gt;
VIEWの定義を変更するには、&amp;lt;code&amp;gt;ALTER VIEW&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 ALTER&lt;br /&gt;
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]&lt;br /&gt;
    [DEFINER = &amp;lt;ユーザ名@ホスト名&amp;gt;]&lt;br /&gt;
    [SQL SECURITY { DEFINER | INVOKER }]&lt;br /&gt;
    VIEW &amp;lt;ビュー名&amp;gt; [(&amp;lt;列名リスト&amp;gt;)]&lt;br /&gt;
    AS &amp;lt;SELECT文&amp;gt;&lt;br /&gt;
    [WITH [CASCADED | LOCAL] CHECK OPTION];&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
基本的な使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 ALTER VIEW active_users AS&lt;br /&gt;
 SELECT user_id, username, email, last_login&lt;br /&gt;
 FROM users&lt;br /&gt;
 WHERE status = &amp;#039;active&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ALTER VIEW&amp;lt;/code&amp;gt; 文は、VIEWが存在しない場合はエラーになる。&amp;lt;br&amp;gt;&lt;br /&gt;
VIEWの存在に関係なく定義を保存したい場合は、&amp;lt;code&amp;gt;CREATE OR REPLACE VIEW&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE OR REPLACE VIEW active_users AS&lt;br /&gt;
 SELECT user_id, username, email, last_login, created_at&lt;br /&gt;
 FROM users&lt;br /&gt;
 WHERE status = &amp;#039;active&amp;#039; AND deleted_at IS NULL;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ALTER VIEW&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;CREATE OR REPLACE VIEW&amp;lt;/code&amp;gt; の使い分けを以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ ALTER VIEW と CREATE OR REPLACE VIEWの比較&lt;br /&gt;
! 項目 !! ALTER VIEW !! CREATE OR REPLACE VIEW&lt;br /&gt;
|-&lt;br /&gt;
| VIEWが存在しない場合 || エラー || 新規作成&lt;br /&gt;
|-&lt;br /&gt;
| VIEWが存在する場合 || 変更 || 置き換え&lt;br /&gt;
|-&lt;br /&gt;
| 用途 || 既存VIEWの変更を明示的に行う場合 || VIEWの存在に関係なく定義を保存する場合&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VIEWの削除 ==&lt;br /&gt;
VIEWを削除するには、&amp;lt;code&amp;gt;DROP VIEW&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DROP VIEW &amp;lt;ビュー名&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
複数のVIEWを一括削除する場合は、カンマ区切りでVIEW名を列挙する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DROP VIEW &amp;lt;ビュー名 1&amp;gt;, &amp;lt;ビュー名 2&amp;gt;, &amp;lt;ビュー名 3&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
VIEWが存在しない場合にエラーを発生させないようにするには、&amp;lt;code&amp;gt;IF EXISTS&amp;lt;/code&amp;gt; 句を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DROP VIEW IF EXISTS &amp;lt;ビュー名&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;DROP VIEW&amp;lt;/code&amp;gt;文には、&amp;lt;code&amp;gt;RESTRICT&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;CASCADE&amp;lt;/code&amp;gt; オプションがある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DROP VIEW &amp;lt;ビュー名&amp;gt; [RESTRICT | CASCADE];&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ DROP VIEWのオプション&lt;br /&gt;
! オプション !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| RESTRICT (デフォルト) || VIEWを削除する。&amp;lt;br&amp;gt;他のVIEWが参照している場合でも削除される。&lt;br /&gt;
|-&lt;br /&gt;
| CASCADE || MySQLでは未サポート&amp;lt;br&amp;gt;RESTRICTと同じ動作。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;※注意&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;MySQLでは、VIEWを削除しても、そのVIEWを参照している他のVIEWは自動的に削除されない。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;参照元のVIEWは無効な状態となり、アクセス時にエラーが発生する。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VIEWの確認 ==&lt;br /&gt;
VIEWの定義や情報を確認するには、複数の方法がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== SHOW CREATE VIEW =====&lt;br /&gt;
VIEWの定義を確認するには、&amp;lt;code&amp;gt;SHOW CREATE VIEW&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SHOW CREATE VIEW &amp;lt;ビュー名&amp;gt;\G&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
この構文により、VIEWの完全な &amp;lt;code&amp;gt;CREATE VIEW&amp;lt;/code&amp;gt; 文が表示される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;SHOW CREATE VIEW&amp;lt;/code&amp;gt; 文を実行するには、&amp;lt;code&amp;gt;SHOW VIEW&amp;lt;/code&amp;gt; 権限が必要である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== INFORMATION_SCHEMA.VIEWS =====&lt;br /&gt;
VIEWの詳細情報を確認するには、&amp;lt;code&amp;gt;INFORMATION_SCHEMA.VIEWS&amp;lt;/code&amp;gt; テーブルを使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SELECT TABLE_SCHEMA, TABLE_NAME, VIEW_DEFINITION, CHECK_OPTION, IS_UPDATABLE,&lt;br /&gt;
        DEFINER, SECURITY_TYPE&lt;br /&gt;
 FROM INFORMATION_SCHEMA.VIEWS&lt;br /&gt;
 WHERE TABLE_SCHEMA = &amp;#039;&amp;lt;データベース名&amp;gt;&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ INFORMATION_SCHEMA.VIEWSの主要なカラム&lt;br /&gt;
! カラム名 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| TABLE_SCHEMA || VIEWが属するデータベース名&lt;br /&gt;
|-&lt;br /&gt;
| TABLE_NAME || VIEW名&lt;br /&gt;
|-&lt;br /&gt;
| VIEW_DEFINITION || VIEWの定義 (SELECT文)&lt;br /&gt;
|-&lt;br /&gt;
| CHECK_OPTION || WITH CHECK OPTIONの設定 (NONE、CASCADED、LOCAL)&lt;br /&gt;
|-&lt;br /&gt;
| IS_UPDATABLE || 更新可能ビューかどうか (YES / NO)&lt;br /&gt;
|-&lt;br /&gt;
| DEFINER || VIEWの所有者&lt;br /&gt;
|-&lt;br /&gt;
| SECURITY_TYPE || SQL SECURITYの設定 (DEFINER / INVOKER)&lt;br /&gt;
|-&lt;br /&gt;
| CHARACTER_SET_CLIENT || クライアント文字セット&lt;br /&gt;
|-&lt;br /&gt;
| COLLATION_CONNECTION || 接続照合順序&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
特定のVIEWの情報を確認する例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SELECT TABLE_NAME, IS_UPDATABLE, DEFINER, SECURITY_TYPE&lt;br /&gt;
 FROM INFORMATION_SCHEMA.VIEWS&lt;br /&gt;
 WHERE TABLE_SCHEMA = &amp;#039;mydb&amp;#039; AND TABLE_NAME = &amp;#039;active_users&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== SHOW FULL TABLES =====&lt;br /&gt;
データベース内のテーブルとVIEWの一覧を確認するには、&amp;lt;code&amp;gt;SHOW FULL TABLES&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SHOW FULL TABLES FROM &amp;lt;データベース名&amp;gt; WHERE Table_type = &amp;#039;VIEW&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
この構文により、VIEWのみを抽出して表示できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SHOW FULL TABLES;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Table_type&amp;lt;/code&amp;gt; カラムの値が&amp;quot;VIEW&amp;quot;である行が、VIEWである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 更新可能ビュー ==&lt;br /&gt;
==== 更新可能ビューの条件 ====&lt;br /&gt;
条件を満たすVIEWは、更新可能ビュー (Updatable View) として動作し、INSERT、UPDATE、DELETE操作が可能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
更新可能ビューの条件を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
* SELECT内に集約関数 (SUM、COUNT、MAX、MIN、AVG) がない&lt;br /&gt;
* DISTINCTがない&lt;br /&gt;
* GROUP BYがない&lt;br /&gt;
* HAVINGがない&lt;br /&gt;
* UNION / UNION ALLがない&lt;br /&gt;
* サブクエリがSELECTリスト内に式として存在しない&lt;br /&gt;
* FROM句に更新不可能なVIEWがない&lt;br /&gt;
* FROM句に複数テーブルのJOINがない (特定条件下ではJOINビューも更新可能)&lt;br /&gt;
* SELECTリスト内にリテラルのみの列がある場合、挿入不可 (ただし更新・削除は可能)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
更新可能ビューの例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW active_users AS&lt;br /&gt;
 SELECT user_id, username, email&lt;br /&gt;
 FROM users&lt;br /&gt;
 WHERE status = &amp;#039;active&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
 -- 更新操作が可能&lt;br /&gt;
 UPDATE active_users SET email = &amp;#039;new@example.com&amp;#039; WHERE user_id = 1;&lt;br /&gt;
 &lt;br /&gt;
 -- 挿入操作が可能&lt;br /&gt;
 INSERT INTO active_users (user_id, username, email)&lt;br /&gt;
 VALUES (100, &amp;#039;newuser&amp;#039;, &amp;#039;newuser@example.com&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
 -- 削除操作が可能&lt;br /&gt;
 DELETE FROM active_users WHERE user_id = 1;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
更新不可能なビューの例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW user_summary AS&lt;br /&gt;
 SELECT status, COUNT(*) AS user_count&lt;br /&gt;
 FROM users&lt;br /&gt;
 GROUP BY status;&lt;br /&gt;
 &lt;br /&gt;
 -- 更新操作不可 (集約関数とGROUP BYを含むため)&lt;br /&gt;
 -- UPDATE user_summary SET user_count = 10 WHERE status = &amp;#039;active&amp;#039;;  -- エラー&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
VIEWが更新可能かどうかを確認するには、&amp;lt;code&amp;gt;INFORMATION_SCHEMA.VIEWS&amp;lt;/code&amp;gt; テーブルの &amp;lt;code&amp;gt;IS_UPDATABLE&amp;lt;/code&amp;gt; カラムを確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SELECT TABLE_NAME, IS_UPDATABLE&lt;br /&gt;
 FROM INFORMATION_SCHEMA.VIEWS&lt;br /&gt;
 WHERE TABLE_SCHEMA = &amp;#039;&amp;lt;データベース名&amp;gt;&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;IS_UPDATABLE&amp;lt;/code&amp;gt; が &amp;lt;u&amp;gt;YES&amp;lt;/u&amp;gt; の場合、VIEWは更新可能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
JOINを含むVIEWの場合、以下に示す条件を満たせば更新可能である。&amp;lt;br&amp;gt;&lt;br /&gt;
* 更新対象のカラムが1つのテーブルに属している&lt;br /&gt;
* JOIN条件が適切に設定されている&lt;br /&gt;
* 外部キー制約が設定されている (推奨)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
JOINビューの更新例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW customer_orders AS&lt;br /&gt;
 SELECT o.order_id, o.order_date, o.customer_id, c.customer_name&lt;br /&gt;
 FROM orders o&lt;br /&gt;
 JOIN customers c ON o.customer_id = c.customer_id;&lt;br /&gt;
 &lt;br /&gt;
 -- 更新可能 (ordersテーブルのカラムのみ更新)&lt;br /&gt;
 UPDATE customer_orders SET order_date = &amp;#039;2024-01-01&amp;#039; WHERE order_id = 1;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== WITH CHECK OPTION ====&lt;br /&gt;
&amp;lt;code&amp;gt;WITH CHECK OPTION&amp;lt;/code&amp;gt; 句を使用すると、VIEWのWHERE条件を満たさないデータの挿入・更新を禁止できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW active_users AS&lt;br /&gt;
 SELECT user_id, username, email, status&lt;br /&gt;
 FROM users&lt;br /&gt;
 WHERE status = &amp;#039;active&amp;#039;&lt;br /&gt;
 WITH CHECK OPTION;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
この設定により、&amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt; が &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; 以外のデータを挿入・更新しようとするとエラーが発生する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 -- 成功 (statusが&amp;#039;active&amp;#039;のため)&lt;br /&gt;
 INSERT INTO active_users (user_id, username, email, status)&lt;br /&gt;
 VALUES (101, &amp;#039;activeuser&amp;#039;, &amp;#039;active@example.com&amp;#039;, &amp;#039;active&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
 -- エラー発生 (statusが&amp;#039;active&amp;#039;でないため)&lt;br /&gt;
 INSERT INTO active_users (user_id, username, email, status)&lt;br /&gt;
 VALUES (100, &amp;#039;newuser&amp;#039;, &amp;#039;new@example.com&amp;#039;, &amp;#039;inactive&amp;#039;);&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
WITH CHECK OPTIONには、&amp;lt;u&amp;gt;CASCADED&amp;lt;/u&amp;gt; と &amp;lt;u&amp;gt;LOCAL&amp;lt;/u&amp;gt; の2つのモードがある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ WITH CHECK OPTIONのモード&lt;br /&gt;
! モード !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| CASCADED (デフォルト)&lt;br /&gt;
|&lt;br /&gt;
* 全てのネストされたVIEWのWHERE条件をチェックする&lt;br /&gt;
* 基底ビューのWHERE条件も含めてチェックする&lt;br /&gt;
|-&lt;br /&gt;
| LOCAL&lt;br /&gt;
|&lt;br /&gt;
* 現在のVIEWのWHERE条件のみチェックする&lt;br /&gt;
* 下位VIEWは各自のCHECK OPTIONに依存する&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* CASCADEDモードの例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW base_view AS&lt;br /&gt;
 SELECT user_id, username, status&lt;br /&gt;
 FROM users&lt;br /&gt;
 WHERE status IN (&amp;#039;active&amp;#039;, &amp;#039;pending&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
 CREATE VIEW active_only AS&lt;br /&gt;
 SELECT user_id, username, status&lt;br /&gt;
 FROM base_view&lt;br /&gt;
 WHERE status = &amp;#039;active&amp;#039;&lt;br /&gt;
 WITH CASCADED CHECK OPTION;&lt;br /&gt;
 &lt;br /&gt;
 -- エラー発生 (base_viewのWHERE条件も含めてチェックされる)&lt;br /&gt;
 INSERT INTO active_only (user_id, username, status)&lt;br /&gt;
 VALUES (100, &amp;#039;user&amp;#039;, &amp;#039;inactive&amp;#039;);&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* LOCALモードの例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW local_view AS&lt;br /&gt;
 SELECT user_id, username, status&lt;br /&gt;
 FROM users&lt;br /&gt;
 WHERE status = &amp;#039;active&amp;#039;&lt;br /&gt;
 WITH LOCAL CHECK OPTION;&lt;br /&gt;
 &lt;br /&gt;
 -- 現在のVIEWのWHERE条件のみチェックされる&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== マテリアライズドビューの代替手段 ==&lt;br /&gt;
MySQLには、マテリアライズドビュー (Materialized View) が存在しない。&amp;lt;br&amp;gt;&lt;br /&gt;
マテリアライズドビューは、クエリ結果を実テーブルとして保存し、高速なアクセスを実現する機能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
MySQLでマテリアライズドビューの代替を実現するには、以下の手順を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== ステップ1 : 集計結果を格納するテーブルを作成 =====&lt;br /&gt;
集計結果を格納するテーブルを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE TABLE mv_user_summary (&lt;br /&gt;
    status VARCHAR(20),&lt;br /&gt;
    user_count INT,&lt;br /&gt;
    last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,&lt;br /&gt;
    PRIMARY KEY (status)&lt;br /&gt;
 ) ENGINE=InnoDB;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== ステップ2 : トリガーまたはイベントスケジューラで更新 =====&lt;br /&gt;
トリガーを使用して、基底テーブルの変更時に自動的に更新する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER $$&lt;br /&gt;
 &lt;br /&gt;
 CREATE TRIGGER update_user_summary&lt;br /&gt;
 AFTER INSERT ON users&lt;br /&gt;
 FOR EACH ROW&lt;br /&gt;
 BEGIN&lt;br /&gt;
    INSERT INTO mv_user_summary (status, user_count)&lt;br /&gt;
    VALUES (NEW.status, 1)&lt;br /&gt;
    ON DUPLICATE KEY UPDATE user_count = user_count + 1;&lt;br /&gt;
 END$$&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
イベントスケジューラを使用して、定期的に更新する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT refresh_user_summary&lt;br /&gt;
 ON SCHEDULE EVERY 1 HOUR&lt;br /&gt;
 DO&lt;br /&gt;
    REPLACE INTO mv_user_summary (status, user_count)&lt;br /&gt;
    SELECT status, COUNT(*)&lt;br /&gt;
    FROM users&lt;br /&gt;
    GROUP BY status;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== ステップ3 : 手動でリフレッシュするストアドプロシージャを作成 =====&lt;br /&gt;
手動でリフレッシュするストアドプロシージャを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER $$&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE refresh_user_summary()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    TRUNCATE TABLE mv_user_summary;&lt;br /&gt;
    INSERT INTO mv_user_summary (status, user_count)&lt;br /&gt;
    SELECT status, COUNT(*)&lt;br /&gt;
    FROM users&lt;br /&gt;
    GROUP BY status;&lt;br /&gt;
 END$$&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &lt;br /&gt;
 -- 手動でリフレッシュ&lt;br /&gt;
 CALL refresh_user_summary();&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
この手法により、マテリアライズドビューと同等の機能を実現できる。&amp;lt;br&amp;gt;&lt;br /&gt;
ただし、データの一貫性とリフレッシュのタイミングには注意が必要である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VIEWの例 ==&lt;br /&gt;
===== アクセス制御 =====&lt;br /&gt;
特定のカラムのみ公開するVIEWを作成し、ユーザにVIEWへのSELECT権限のみ付与する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示す方法により、機密情報 (パスワード、個人情報等) を隠蔽できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW public_user_info AS&lt;br /&gt;
 SELECT user_id, username, email&lt;br /&gt;
 FROM users;&lt;br /&gt;
 &lt;br /&gt;
 -- 基底テーブルへのアクセスを制限し、VIEWへのアクセスのみ許可&lt;br /&gt;
 GRANT SELECT ON database_name.public_user_info TO &amp;#039;readonly_user&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== 複雑なクエリの簡素化 =====&lt;br /&gt;
複数テーブルのJOINを含む頻繁に使うクエリをVIEW化する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
これにより、アプリケーションコードが簡潔になり、保守性が向上する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW order_summary AS&lt;br /&gt;
 SELECT o.order_id, o.order_date, c.customer_name, c.email,&lt;br /&gt;
        p.product_name, p.price, o.quantity, p.price * o.quantity AS total&lt;br /&gt;
 FROM orders o&lt;br /&gt;
 JOIN customers c ON o.customer_id = c.customer_id&lt;br /&gt;
 JOIN products p ON o.product_id = p.product_id;&lt;br /&gt;
 &lt;br /&gt;
 -- 簡素化されたクエリ&lt;br /&gt;
 SELECT * FROM order_summary WHERE order_date &amp;gt;= &amp;#039;2024-01-01&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== データ抽象化 =====&lt;br /&gt;
テーブル構造の変更からアプリケーションを保護する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
これにより、テーブルの正規化や分割を行った場合でも、VIEWを使用することでアプリケーションへの影響を最小限に抑えられる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW user_profile AS&lt;br /&gt;
 SELECT user_id, username, email, created_at&lt;br /&gt;
 FROM users;&lt;br /&gt;
 &lt;br /&gt;
 -- テーブル構造が変更されても、VIEWの定義を変更すれば、アプリケーションコードは影響を受けない&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== 計算列の提供 =====&lt;br /&gt;
計算値を列として提供するVIEWを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW product_inventory AS&lt;br /&gt;
 SELECT product_id, product_name, price, stock,&lt;br /&gt;
        price * stock AS inventory_value,&lt;br /&gt;
        CASE&lt;br /&gt;
           WHEN stock = 0 THEN &amp;#039;Out of Stock&amp;#039;&lt;br /&gt;
           WHEN stock &amp;lt; 10 THEN &amp;#039;Low Stock&amp;#039;&lt;br /&gt;
           ELSE &amp;#039;In Stock&amp;#039;&lt;br /&gt;
        END AS stock_status&lt;br /&gt;
 FROM products;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
計算ロジックをVIEWに集約することで、アプリケーション側の実装を簡素化できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VIEWの制限事項 ==&lt;br /&gt;
MySQLのVIEWには、以下に示す制限事項がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== 参照可能なテーブル数 =====&lt;br /&gt;
&amp;lt;u&amp;gt;VIEW定義で参照できるテーブルの最大数は61個である。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== インデックス作成不可 =====&lt;br /&gt;
VIEW自体にはインデックスを作成できない。&amp;lt;br&amp;gt;&lt;br /&gt;
ただし、基底テーブルのインデックスは、MERGEアルゴリズムの場合に利用される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
TEMPTABLEアルゴリズムの場合は、基底テーブルのインデックスが利用できないため、パフォーマンスが低下する可能性がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== ビューのサブクエリ制約 =====&lt;br /&gt;
ビューのサブクエリで使用されているテーブルを同時に更新できない。&amp;lt;br&amp;gt;&lt;br /&gt;
ただし、TEMPTABLEアルゴリズムを明示的に指定した場合は例外である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== テーブル変更によるビュー無効化 =====&lt;br /&gt;
&amp;lt;code&amp;gt;DROP TABLE&amp;lt;/code&amp;gt; や &amp;lt;code&amp;gt;ALTER TABLE&amp;lt;/code&amp;gt; でVIEWが参照しているテーブルが変更されると、VIEWが無効化される可能性がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE VIEW user_view AS SELECT user_id, username FROM users;&lt;br /&gt;
 &lt;br /&gt;
 -- カラム名を変更するとVIEWが無効化される&lt;br /&gt;
 ALTER TABLE users CHANGE COLUMN username user_name VARCHAR(100);&lt;br /&gt;
 &lt;br /&gt;
 -- VIEWにアクセスするとエラーが発生する&lt;br /&gt;
 SELECT * FROM user_view;  -- エラー: Unknown column &amp;#039;username&amp;#039;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;この場合は、VIEWを再作成する必要がある。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== カラム名の長さ制限 =====&lt;br /&gt;
&amp;lt;u&amp;gt;カラム名エイリアスの長さ制限は最大64文字である。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== SHOW VIEW権限 =====&lt;br /&gt;
&amp;lt;code&amp;gt;SHOW CREATE VIEW&amp;lt;/code&amp;gt; 文を実行するには、&amp;lt;code&amp;gt;SHOW VIEW&amp;lt;/code&amp;gt; 権限が必要である。&amp;lt;br&amp;gt;&lt;br /&gt;
権限がない場合は、エラーが発生する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== トリガーの設定不可 =====&lt;br /&gt;
VIEWに対してトリガーを設定することはできない。&amp;lt;br&amp;gt;&lt;br /&gt;
トリガーは、基底テーブルにのみ設定可能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== ALGORITHM=MERGEの制約 =====&lt;br /&gt;
以下のクエリ要素を含むVIEWは、MERGEアルゴリズムを使用できない。&amp;lt;br&amp;gt;&lt;br /&gt;
* 集約関数 (SUM、COUNT、MAX、MIN、AVG)&lt;br /&gt;
* DISTINCT&lt;br /&gt;
* GROUP BY&lt;br /&gt;
* HAVING&lt;br /&gt;
* UNION / UNION ALL&lt;br /&gt;
* サブクエリ (SELECTリスト内)&lt;br /&gt;
* ユーザ定義変数への代入&lt;br /&gt;
* LIMITとOFFSETの組み合わせ&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;この場合、自動的にTEMPTABLEアルゴリズムが使用される。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki&lt;br /&gt;
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,MySQL,VIEW,ビュー,CREATE VIEW,ALTER VIEW,DROP VIEW,Updatable View,更新可能ビュー,WITH CHECK OPTION,ALGORITHM,MERGE,TEMPTABLE,DEFINER,SQL SECURITY,Materialized View,マテリアライズドビュー,Database,データベース,SQL,電気回路,電子回路,基板,プリント基板&lt;br /&gt;
|description={{PAGENAME}} - MySQLのVIEW作成、変更、削除、更新可能ビュー、マテリアライズドビュー代替手段に関する総合ガイド | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux&lt;br /&gt;
|image=/resources/assets/MochiuLogo_Single_Blue.png&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:MySQL]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>