SQLではテーブルからデータを抽出することが可能ですが、データベース処理を行っているとビュー(VIEW)を参照するという機会にも遭遇します。
本記事では、データベース初心者の方向けにSQLにおけるビュー(VIEW)の基本的な使い方をサンプルを交えながらご紹介していきたいと思います。
目次
SQLのビュー(VIEW)って何?
SQLで利用されるビューは、「仮想テーブル」と考えてもらえば良いかと思います。
ユーザーが必要な部分だけを抜粋したり、各テーブルからユーザーがデータを参照しやすいように加工したビューを作成することが出来ます。
実体としてのデータは存在しませんが、ユーザーからはテーブル操作を行うのと同じ感覚で参照することが可能です。
ビューの実体
ビューに実体のデータは存在しないとご紹介しましたが、ビューの実体は「SELECT文」です。
ビューにアクセスする際、定義されたSELECT文が実行され、抽出されたデータの塊を参照することで、仮想テーブルのように扱うことが可能となっています。
ビューを利用する目的
ビューには大きく2つの利用目的があり、「データ抽出の簡略化」と「セキュリティ」が挙げられます。
データ抽出の簡略化
SQLで頻繁に利用する各種テーブルから抽出したデータの塊が存在する場合、毎回複雑なクエリを作成して実行するのは手間が掛かるのと同時にミスにも繋がりかねません。
一方で、ビューとして定義しておけば、ユーザーはビューにアクセスするだけで自動的に作成済みのクエリが実行されるため、開発効率を大幅に削減することが可能となります。
セキュリティ
ビューを利用することにより、実体のテーブルに格納されているユーザーに直接見せたくないデータへのアクセスを制限することが可能になります。
また、不用意にデータを更新してしまうトラブルを防ぐことが出来るなど、実際にユーザーが必要なデータのみを抜粋したビューへのアクセスに制限することで、セキュリティを強化することにも繋がります。
SQLでビュー(VIEW)の基本的な使い方
利用用途を確認したところで、実際にSQLでビューを使う方法について確認していきましょう。
ビューの作成
まずはビューの作成ですが「CREATE VIEW文」を使用します。
CREATE VIEW ビュー名 AS 定義;
定義の部分には、実際にビューとして表示する内容を取得する「SELECT文」を記述します。
ビューの参照
次にビューの参照方法ですが、テーブルを参照する際と同じく「SELECT文」が利用可能です。
SELECT カラム名,(カラム名, ...) FROM ビュー名;
通常テーブル名を指定するFROM句にビュー名を指定するだけです。
ビューの変更
ビューの変更方法は2種類存在します。
「ALTER VIEW文」と「CREATE VIEW OR REPLACE文」を使用する方法です。
ALTER VIEW文
まずはALTER VIEW文の構文を確認していきましょう。
ALTER VIEW ビュー名 AS 定義;
CREATE VIEWと記述方法は同じです。
ビュー名に既存のビューを指定することで、新たに指定された定義内容に変更することが可能です。
CREATE VIEW OR REPLACE文
もう一つの方法が「CREATE VIEW OR REPLACE文」を使用する方法です。
CREATE VIEW OR REPLACE ビュー名 AS 定義;
指定したビュー名がデータベースに存在しない場合は新規作成、既に存在する場合には既存ビューの定義を変更する処理が実行されます。
ビューの削除
ビューの削除を行うには「DROP VIEW文」を利用することが可能です。
DROP VIEW (IF EXISTS) ビュー名;
DROP VIEWで指定したビュー名が存在しなかった場合、通常エラーとして処理が終了します。
SQL文自体をエラーとしたくない場合には、「DROP VIEW IF EXISTS」と記述することで処理を正常終了させることが可能です。
SQLでビュー(VIEW)を使ったサンプルを確認しよう
では実際にサンプルで動作確認を行ってみましょう。
今回はサンプル用のテーブルとして、「office」と「region」を下記のデータで用意しました。
officeテーブル
+------+--------------------+-----------+ | id | office_name | region_id | +------+--------------------+-----------+ | 1 | 新宿支店 | 3 | | 2 | 渋谷支店 | 3 | | 3 | 函館支店 | 1 | | 4 | 梅田支店 | 5 | | 5 | 那覇支店 | 9 | | 6 | ソウル支店 | 99 | | 7 | バンコク支店 | 99 | +------+--------------------+-----------+
regionテーブル
+------+-------------+ | id | region_name | +------+-------------+ | 1 | 北海道 | | 2 | 東北 | | 3 | 関東 | | 4 | 中部 | | 5 | 近畿 | | 6 | 中国 | | 7 | 四国 | | 8 | 九州 | | 9 | 沖縄 | +------+-------------+
ビューを作成してみよう
まずは「office」テーブルから「office_name」と「region_id」だけを抽出したビューを作成してみましょう。
CREATE VIEW office_view AS select office_name, region_id from office;
実際に作成出来ているかビュー名を指定したSELECT文で確認してみましょう。
SELECT * FROM office_view;
実行した結果が下記の通りです。
+--------------------+-----------+ | office_name | region_id | +--------------------+-----------+ | 新宿支店 | 3 | | 渋谷支店 | 3 | | 函館支店 | 1 | | 梅田支店 | 5 | | 那覇支店 | 9 | | ソウル支店 | 99 | | バンコク支店 | 99 | +--------------------+-----------+
ビューの定義を変更してみよう
では少し応用編として、「office」と「region」テーブルから「office_name」と「region_name」を取得するビューに変更してみましょう。
ビューの定義を変更したい場合には、「ALTER VIEW文」と「CREATE VIEW OR REPLACE文」が利用可能でしたね。
今回はALTER VIEW文を利用して変更してみたいと思います。
ALTER VIEW office_view AS select office.office_name, region.region_name from office inner join region on region.id = office.region_id;
変更したビュー名をSELECT文で確認した結果が下記となります。
+--------------+-------------+ | office_name | region_name | +--------------+-------------+ | 函館支店 | 北海道 | | 新宿支店 | 関東 | | 渋谷支店 | 関東 | | 梅田支店 | 近畿 | | 那覇支店 | 沖縄 | +--------------+-------------+
ビューの定義が変更されて、取得された値が変わっていることをご確認頂けます。
ビューを削除してみよう
最後に「DROP VIEW文」でビューを削除してみましょう。
DROP VIEW office_view;
実行後、select文で「office_view」を参照しようとすると下記のようなエラーとなります。
ERROR 1146 (42S02): Table 'test_db.office_view' doesn't exist
さいごに: SQLのビュー(VIEW)操作を理解して適切なデータベース処理を実施しよう
本記事では、SQLのビュー操作について、基本的な使い方をサンプルを用いながらご紹介してきました。
SQLの学習を進めている段階ではあまり使うことのない機能かも知れませんが、実務では頻繁に利用される機能です。
参照方法など、基本的な使い方は通常のテーブル操作とほとんど変わりませんので、聴き慣れない難しそうな処理と考えず積極的に活用してみてください。
記事内で利用するサンプルはMySQLを利用して検証しています。
データベース毎に記述方法が異なることもありますので、ご利用のデータベースに合わせて適宜読み替えをお願いします。