【例付き】ビュー(View)とは?仕組みと使い所【SQL】
DBの世界で利用されるビュー(View)がどんなものか、どんな仕組みで動作するのか、使うことでどんなメリットが得られるのかを解説します。
どんな機能か
ビューとは一つまたは複数のテーブルに対するクエリの実行結果を基にした仮想的なテーブルです。
実行結果を物理的にデータとして保存する種類のビュー(マテリアライズドビュー)もありますが、一般的なのはクエリ実行時に基となるテーブルからデータを都度取得する種類のビュー(仮想ビュー)です。
実際に作成する例を見ることでイメージがつきやすくなると思いますので、ビューを作る例をお見せします。
例1:一つのテーブルを基にしたビュー
CREATE VIEW active_employees AS
SELECT id, name
FROM employees
WHERE status = 'Active';
この例ではemployeesテーブルに対してstatusがActiveなデータのうち、idとnameだけを取得した結果をactive_employeesという名のビューとして作成しています。Activeなemployeeを対象にクエリを実行することが分かっているなら、active_employeesを対象にすることで単純なクエリで欲しいデータを得られます。
例2:複数のテーブルを基にしたビュー
CREATE VIEW employee_department_info AS
SELECT e.id AS employee_id, e.name AS employee_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.id;
この例ではemployeesテーブルとdepartmentsテーブルを結合させてビューを作成しています。
employeesテーブルのみを対象にした場合だとすべてのカラムの情報を取得しても部門に関する情報はIDしか分からず、具体的にどの部門を指しているのかがすぐにわかりません。しかし上記のビューを利用すれば従業員の名称と部門の名称がどちらも明らかになった結果を単純なクエリで取得できます。
メリット
例の部分でもビューを利用するメリットを少し話しましたが、改めて説明します。
セキュリティ面:ユーザーによって見せるデータを柔軟に設定することが可能になります。例えば、テーブルのデータすべては見せたくないけど、特定のカラムのデータは業務上公開が必要な場合などに役立ちます。基となるテーブルに対する権限とビューの権限は独立して存在しているためにこのようなメリットが生まれます。
複雑なクエリの簡略化:サブクエリが含まれた複雑なクエリでしか取得できないデータであっても、ビューとして定義しておくことで簡素なクエリでの取得を可能にします。
正規化されたテーブルは余計なデータを保存する必要がなく管理が楽ですが、レポート作成や調査の時などに必要な情報が欲しいときには結合や条件文を含んだ複雑なクエリを使わないといけないというデメリットがあります。しかしビューを利用することでそのデメリットを解消させられます。
実際のテーブルは正規化されているにも関わらず、ビューにより人が扱いやすい形に疑似的なテーブルを作成しておけます。また仮想ビューであればディスクの容量を必要とすることもありません。
ビューは人やハードに優しいとても優れた機能であることを理解していただけたと思います。
仮想ビューを使う上での注意点
とても便利な仮想ビューですが、その仕組み上注意すべき点があります。
ビューに対するクエリの実行時にはビューを作成するための実テーブルに対するクエリも投げられるという点です。もしビューを作成するためのクエリが計算量の多い負荷が高いものであった場合には、ビューに対するクエリが単純であったとしても結果が返ってくるまでにかなり長い時間がかかるかもしれません。ビューの設計にはお気を付けください。
ただしビューは実際にデータを保存しているわけではないために再作成が容易です。
またビューに対してはSELECTだけでなくINSERT、UPDATE、DELETEも利用可能なのですが条件はあります。基となるテーブルが複数ある場合やSUMなどの集合関数を含んだ場合には基本不可です。またこれらに当てはまっていなくても基となるテーブル側の制約やSQLの機能によってはデータ操作が不可なので、システムにビューを通じたデータ操作を組み込むことを考えているなら事前によく検証した方が良いです。
まとめ
とてつもなく便利なビューですが、ビュー自体の設計やクエリをどう設計するかによって性能が大きく変わる少し曲者でもあります。失敗が許されやすい機能なので、設計と検証を繰り返して適切なビューとクエリの設計をできるようになり、快適にデータを扱える環境を作りましょう。