SQLのビューを作成/使用するサンプルです。Oracleで確認しています。
目次
説明 | ビュー(view) |
サンプル | ビューを作成して表示する(create) |
ビューの値を更新する(update) | |
ビューに行を追加する(insert) | |
ビューの行を削除する(delete) | |
ビューを削除する(drop) | |
ビューを確認する(USER_VIEWS) |
ビュー(view)
- ビューは、1つ以上の表を元にした実体を持たない表のことです。
- 表の中の一部の列のみ表示したい場合や列の別名を表示したいときなどで使用します。
- 表を結合して1つのビューにすれば、都度結合して検索する必要がなくなります。
- ビューに対して更新は可能です。その場合、元の表にも反映されます。
- ビューの元の表は、実表と呼ばれます。
- ビュー(view)は、見るという意味です。
- 以下は、Oracleのビューのリンクです。
https://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_8004.htm
ビューを作成して表示する(create)
ビューを作成するサンプルです。
1.以下、2つのテーブルがあるとします。
id | name | romaji |
---|---|---|
1 | 鈴木 | suzuki |
2 | 田中 | tanaka |
3 | 佐藤 | sato |
ID | NAME | CATEGORY |
---|---|---|
1 | りんご | フルーツ |
3 | にんじん | 野菜 |
2.上記2テーブルからTestView1というビューを作成します。
CREATE OR REPLACE VIEW TestView1 AS
SELECT
a.id,
a.name as name1,
b.name as name2
FROM employee a
inner join SALES b
on a.id = b.id;
1行目のTestView1は、作成するビュー名です。
OR REPLASEは任意です。REPLASEがある場合は実行すると上書きされます。
2~8行目は、select文でemployeeテーブルとSALESテーブルをinner joinで結合しています。
3.ビューから値を取得します。
select * from TestView1;
4.以下の結果を取得できます。
id | name1 | name2 |
---|---|---|
1 | 鈴木 | りんご |
3 | 佐藤 | にんじん |
2つのテーブルにある項目をまとめて表示します。
SQLで結合するjoinを記述する必要はありません。
5.ビューを読み取り専用にする場合は以下でビューを作成します。
CREATE OR REPLACE VIEW TestView1 AS
SELECT
a.id,
a.name as name1,
b.name as name2
FROM employee a
inner join SALES b
on a.id = b.id
with read only;
9行目のようにwith read onlyを付けます。
読み取り専用のビューに対して更新した場合、「ORA=42399:読み取り専用ビューではDML操作を実行できません」のエラーが出ます。
ビューの値を更新する(update)
上記で作成したビューに対して更新を行います。
1.ビューに対してupdateを行います。
update TestView1
set NAME2 = 'ばなな'
where id = 1;
2.実行後にビューで確認します。
select * from TestView1;
id | name1 | name2 |
---|---|---|
1 | 鈴木 | ばなな |
3 | 佐藤 | にんじん |
更新されています。
ビューの元になっているSALESテーブルの値も更新されます。
employeeテーブルには存在するがビューには存在しないIDを指定した場合
update TestView1
set NAME2 = 'ばなな'
where id = 2;
ビューに対して存在しないIDを指定しても何も更新されません。
ビューに行を追加する(insert)
上記で作成したビューに対してinsertを行います。
1.ビューに対してinsertします。
insert into TestView1
(id,name1)
values (4,'渡辺');
2.テーブルは以下のようになります。
employeeテーブルに行が追加されます。SALESテーブルには変更はありません。
id | name | romaji |
---|---|---|
1 | 鈴木 | suzuki |
2 | 田中 | tanaka |
3 | 佐藤 | sato |
4 | 渡辺 | null |
ID | NAME | CATEGORY |
---|---|---|
1 | ばなな | フルーツ |
3 | にんじん | 野菜 |
3.ビューは以下のようになります。
select * from TestView1;
id | name1 | name2 |
---|---|---|
1 | 鈴木 | ばなな |
3 | 佐藤 | にんじん |
追加したデータはビューの表示の条件に合致しないのでビューには表示されません。
ビューから複数の表に対してinsertしようとした場合
insert into TestView1
(id,name1,name2)
values (4,'渡辺','いちご');
ORA-01776: 結合ビューを介して複数の実表を変更できません。のエラーが発生します。
ビューの行を削除する(delete)
上記で作成したビューに対してdeleteを行います。
1.ビューに対してdeleteします。
delete from TestView1
where id = '1';
2.以下は、実行結果です。employeeテーブルからID1の行が消えています。
id | name | romaji |
---|---|---|
2 | 田中 | tanaka |
3 | 佐藤 | sato |
4 | 渡辺 | null |
ID | NAME | CATEGORY |
---|---|---|
1 | ばなな | フルーツ |
3 | にんじん | 野菜 |
3.ビューは以下のようになります。
select * from TestView1;
id | name1 | name2 |
---|---|---|
3 | 佐藤 | にんじん |
ID1のデータは、ビューの表示の条件に合致しなくなったので表示されなくなりました。
employeeテーブルには存在するがビューには存在しないIDを指定した場合
delete from TestView1
where id = '2';
ビューに対して存在しないIDを指定しても何も更新されません。
ビューを削除する(drop)
ビューを削除するサンプルです。
drop view TestView1;
drop viewとビュー名を指定します。
ビューを確認する(USER_VIEWS)
USER_VIEWSテーブルで作成したビューを確認できます。
select * from USER_VIEWS
where VIEW_NAME = 'TESTVIEW1';
※whereの条件の値のビュー名やテーブル名は大文字小文字を区別します。
関連の記事