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