ビューを活用できるようになると新しくテーブルを作る必要がなくなったり、同じようなSQLを1つにまとめたりできるようになります。
ここではビューを使うメリット・デメリットや使い方をご紹介します。
ビューとは
ビューとは一言で言えば仮想テーブルのことで、言い換えるとSQLに名前をつけて保存したものです。
複数のテーブルを使った複雑なSQLでも、ビューを一度作っておけば何度でも同じSQLが使えます。
ビューのメリット
ビューを使うことで以下のメリットがあります。
テーブルを整形し、使いやすい形にできる
ビューが効力を最も発揮するのは複数のテーブルを結合した結果を保存するときです。
各テーブルのidを外部キーとしている場合は、ビューを活用することでいつでもidに紐づいた情報を参照できるようになります。
SQLをすっきり記述できる
結合やサブクエリはSQLを冗長的かつ煩雑になりやすいです。
これらをビューに保存しておけばSQLをすっきり記述できるようになります。
SELECT S.ID, S.NAME
FROM STUDENTS S
WHERE S.ID IN(
SELECT STUDENT_ID
FROM SCORES
WHERE MATH > 80
AND ENGLISH > 80
AND NATIONAL_LANGUAGE > 80
AND SOCIAL_STUDIES > 80
AND SCIENCE > 80
)
このSQLは5教科の点数が全て80点以上の生徒のIDと名前を取得します。
条件にサブクエリを使っているので長く複雑になっていますが、サブクエリをビューにすることですっきりと記述できます(ビューの作り方は後述します)。
SELECT S.ID,S.NAME
FROM STUDENTS S
WHERE S.ID IN (SELECT STUDENT_ID FROM BEST_SCORE_VIEW)
BEST_SCORE_VIEWがビューです。サブクエリのSQLをそのままビュー化しているイメージです。またSQLをみて分かる通り、ビューはテーブルと同じようにSQL内で扱うことができます。
同じSQLの繰り返しを防げる
プログラムの至る所で同じようなサブクエリを使用している場合、ビューを使うことで同じSQLの繰り返しを防ぎ、可読性を向上させることが可能です。ビューを使って、SQLでも冗長化を防止しましょう。
ビューのデメリット
パフォーマンスが低下する可能性がある
ビューはテーブルと異なりインデックスを作成できません。
インデックスとはテーブルからデータを効率良く探すための辞書のことで、データの取得に時間がかかる場合に作成が検討されます。
ビューにはこのインデックスが作成できないので、ビューを他のテーブルやビューと結合したり、ビューに対してwhereで条件をつけるとパフォーマンスが低下する恐れがあります。
特にビューの中でビューを使う多重ビューはデータ取得が大幅に遅くなることもあるので基本的には使わない方が良いでしょう。
ビューの使い方
今回は社員テーブルと部署テーブルと支店テーブルを使います。
それぞれのテーブル構造をデータは以下の通りです。
これを社員テーブルを起点に結合し、各社員の部署名と支店名を同時に取得する場合は以下のようなSQLが必要になります。
SELECT E.ID, E.NAME, B.NAME AS DEPARTMENT_NAME, D.NAME AS BRANCH_NAME
FROM EMPLOYEE E
JOIN BRANCH B ON E.BRANCH_ID = B.ID
JOIN DEPARTMENT D ON E.DEPARTMENT_ID = D.ID
結果:
この結果をいつでも取得したい場合にビューが活用できます。
ビューの作成
ビューを作成するにはCREATE VIEW文を使います。
CREATE VIEW EMPLOYEE_VIEW AS
SELECT E.ID, E.NAME, B.NAME AS DEPARTMENT_NAME, D.NAME AS BRANCH_NAME
FROM EMPLOYEE E
JOIN BRANCH B ON E.BRANCH_ID = B.ID
JOIN DEPARTMENT D ON E.DEPARTMENT_ID = D.ID
これでEMPLOYEE_VIEWが作成されました。
試しにVIEWをSELECTしてみましょう。
SELECT * FROM EMPLOYEE_VIEW
結果:
CREATE VIEWで保存したSQLの結果が正常に取得できました。
ビューの行・列の指定
作成したビューはテーブルと同じような扱いができるので、SELECT句で取得する列を指定したり、WHERE句で行の選択が可能です。
SELECT ID, NAME, BRANCH_NAME
FROM EMPLOYEE_VIEW
WHERE ID = 1
結果:
ビューのデータの更新
ビューを介してテーブルの実データを更新することもできます。
ビューから見て裏側にあるテーブルを更新できるので、テーブルを隠匿しつつデータの更新が可能です。
UPDATE EMPLOYEE_VIEW
SET NAME = '遠藤'
WHERE ID = 1;
SELECT *
FROM EMPLOYEE_VIEW
WHERE ID = 1;
結果:
ただし、以下のビューの場合はデータを更新できません。
式を使用した列は更新できない
例えば四則演算を含む列や、関数を使用した列は更新できません。試してみましょう。
scores:
このscoresテーブルから各生徒ごとの合計得点を計算した列を持つビューを作成します。
CREATE VIEW SCORES_VIEW AS
SELECT ID, STUDENT_ID, MATH + ENGLISH + NATIONAL_LANGUAGE + SOCIAL_STUDIES + SCIENCE AS TOTAL
FROM SCORES S
scores_view:
この合計列は更新できません。
UPDATE SCORES_VIEW SET TOTAL = 500
結果:
ORA-01733: virtual column not allowed here
外部キーによって結合したテーブルの内、親側の列は更新できない
結合したテーブルの親側の列を更新してしまうと子テーブルのデータに影響を及ぼす為、ビューで更新することはできません。外部キー制約がない場合は問題なく更新できます。
集計関数およびgroup byを使ったビューでは更新自体できない
SUM()やMAX()などの集計関数やgroup byを使ったビューの場合は全ての列が更新不可になります。
ビューの削除
ビューの削除はDROP VIEW文を使います。
DROP VIEW EMPLOYEE VIEW
ビューを削除しても実データの入っているテーブルに影響は与えません。
以上でビューの作成方法についてひと通り解説しました。効率よくデータアクセスできるよういになりますので是非今回のSQLもマスターして今後活用ください。
- カテゴリ:
- キーワード: