目次
ビュー(view)を作成する
CREATE VIEWの基本構文
SQLの「CREATE VIEW」を使えば、ビューを作成できます。
ビューの基本構文
CREATE VIEW <ビュー名> AS <SELECT文> [WITH READ ONLY] [WITH CHECK OPTION];
※ [WITH READ ONLY] [WITH CHECK OPTION]は省略可
| パラメータ | 説明 | 
| WITH READ ONLY | 読み取り専用のビューを作成する | 
| WITH CHECK OPTION | 更新可能なビューを作成する | 
「WITH READ ONLY」を指定すれば読み取り専用のビュー、「WITH CHECK OPTION」を指定すれば更新可能なビューを作成できます。
ただし、次の条件に一致する場合は、更新可能な「WITH CHECK OPTION」を指定しても、ビューは更新できません。
- 集合関数(MAXやAVGなど)を使用
 - DISTINCT、GROUP BY、HAVINGを使用
 - 複数の表を結合している。(例外あり)
 - 副問合せを使用
 
スポンサーリンク
本記事では「userテーブル」と「departmentテーブル」に、次のようなデータが格納されていることを前提としています。
【userテーブル】
| ID (id) ※PK | 名前 (name) | 住所 (address) | 年齢 (age) | 部署ID (department_id) | 
| 1001 | 鈴木一郎 | 東京都 | 44 | 1 | 
| 1002 | 佐藤次郎 | 埼玉県 | 32 | 1 | 
| 1003 | 田中三郎 | 千葉県 | 24 | 4 | 
| 1004 | 伊藤四郎 | 東京都 | 22 | 2 | 
| 1005 | 斎藤五郎 | 東京都 | 35 | 2 | 
【departmentテーブル】
| ID (id) ※PK | 部署名(name) | 
| 1 | 営業部 | 
| 2 | 開発部 | 
| 3 | 総務部 | 
CREATE VIEWの使用例
次の例では「userテーブル」と「departmentテーブル」から営業部の社員情報を抽出(user.department_id = '1')したビュー(sales_user)を作成しています。
■CREATE VIEWの例
CREATE VIEW sales_user AS 
    SELECT 
        u.id, u.name, u.age, d.name AS department_name 
    FROM 
        sampledb.user u, sampledb.department d
    WHERE 
        u.department_id =  d.id
        AND u.department_id = '1';■作成したビューの確認
> SELECT * FROM sales_user;
+------+----------+------+-----------------+
| id   | name     | age  | department_name |
+------+----------+------+-----------------+
| 1001 | 鈴木一郎 |   44 | 営業部           |
| 1002 | 佐藤次郎 |   32 | 営業部           |
+------+----------+------+-----------------+
2 rows in set (0.01 sec)「CREATE VIEW」でビューを作成した結果、営業部の社員情報を管理するビュー「sales_user」が作成されました。
今回作成したビューは、結合しているためビューを更新することはできません。試しに「INSERT文」でデータを追加してみると、エラーが出力されます。
> INSERT INTO sales_user VALUES ('2001', '営業部一郎','20','1');
ERROR 1394 (HY000): Can not insert into join view 'sampledb.sales_user' without fields listビュー(view)を削除する
DROP VIEWの基本構文
SQLの「DROP VIEW」を使えば、ビューを削除できます。
DROP VIEWの基本構文
DROP VIEW <ビュー名>;
DROP VIEWの使用例
次の例では上記で作成したビュー「sales_user」を削除しています。
■DROP VIEWの例
DROP VIEW sales_user;
 