SQLのビューとは?
SQLはリレーショナルデータベース管理システム(RDBMS)で用いられるデータベース操作言語です。データベース操作言語とはデータの操作や定義を行う言語を指します。
SQLのビューとは1つもしくは複数の表から任意のデータを抽出したものです。さらに複数の表やビューのデータを組み合わせることもできます。実際の表は実表と言い、実際のDBのデータが含まれます。ビューは導出表と言い、仮想的な表を表します。ビューは実表を窓から覗いたイメージで実際のDBのデータを含みません。
ビューのメリット
ビューのメリットはSELECT文が何度も出てくるSQLを簡素化し、メンテナンスしやすくしてくれます。
また機密情報を特定権限を持つユーザにだけ表示したい場合もビューのアクセス制御により、開示情報をコントロールすることができます。それにより情報漏洩リスクを最小に抑えることができます。
ビューでできること
ビューはDBデータに対して以下の抽出処理を行います。 ・DB表(テーブル)の行の抽出 RDBの選択(Selection)に相当します。 ・DB表(テーブル)の列の抽出 RDBの射影(Projection)に相当します。 ・複数のDB表(テーブル)の結合 RDBの結合(Join)に相当します。
加えてDBデータの更新も可能です。 ・DB表(テーブル)の更新 表のINSERTやUPDATEおよびDELETEに対応します。 更新条件に従い更新可能かどうか判断します(詳細は後述します)。
このように、ビューは多様な抽出処理に加えて更新処理でも利用できるので、セキュリティ保護しながらDBアクセスを簡素化することが可能です。
ビューの作成方法
ビューの作成はCREATE VIEWを使用します。 構文: CREATE VIEW ビュー名 AS SELECT文のステートメント; ビュー名 作成するビューの名前 SELECT文のステートメント ビューで使われるデータ抽出条件
ビューの削除方法
ビューの削除はDROP VIEWを使用します。このコマンドはビューの所有者が行います。 構文: DROP VIEW ビュー名;
ビューで指定するSELECT文の使い方
SELECT文はデータの検索・抽出を行います。ビューはそのSELECT文をビュー名で定義するものです。
CREATE VIEWのSELECT文ステートメントではORDER BYは指定できませんのでご注意ください。ORDER BYはビューの作成時ではなく、ビューに対して実際にSELECTを行うする際に指定します。 構文: SELECT [ALL | DISTINCT] 列名 FROM “テーブル(表)名” [WHERE 条件式] [GROUP BY “カラム(列)名” [HAVING 条件式]];
SELECT文の構文は次の句と条件からなります。 ・SELECT句 SELECT文の実行によりデータの検索・抽出を行います。 [ALL | DISTINCT] ALL:デフォルト値、重複検索時もすべてを返します。 DISTINCT:重複を除きます。 列名 列名称・複数指定可、 * を指定すると全ての列を対象とします。 ・FROM句 テーブル(表)を指定します。 テーブル(表)名 複数のテーブルが指定可能です。 ・WHERE句 抽出条件を指定します。 条件式 演算子を用いた条件を指定します。 ・GROUP BY句 カラム(列)名のグループ化を行います。 HAVING句 GROUP BY句の集計結果に抽出条件を設定します。
使用例:ビューを使わない場合 SELECT * FROM 顧客テーブル WHERE 顧客ID <= 09200 ORDER BY 住所コード; (顧客テーブルから顧客番号09200番以下の顧客情報を住所コードでソートし、全件表示します) 使用例:ビューを使う場合の処理 CREATE VIEW ビュー名 AS SELECT * FROM 顧客テーブル WHERE 顧客ID <= 09200; (顧客テーブルから顧客番号09200番以下の顧客情報を全件表示するビューを作成します) SELECT * FROM ビュー名 ORDER BY 住所コード; (ビューを用いて、抽出結果を住所コードでソートします)
具体的なSQLのビューの使い方、参照方法は?
ビューの参照方法は、ビュー名に対してSELECT文で抽出するだけです。その他のビューの使い方として以下のような作業が挙げられます。 ・ビューを変更すること ・ビューのデータを更新すること ・ビューのテーブルを結合すること ・ビューの詳細情報を確認すること
具体的な使い方は以降で説明していきます。
ビューの変更方法
ビューの変更はALTER VIEWまたはCREATE OR REPLACEを用います。 ALTER VIEWの使い方はCREATE VIEWと同じで、作成済みビューに対して行います。 構文: ALTER VIEW ビュー名 AS SELECT文のステートメント;
CREATE OR REPLACEはビューが存在しない場合はCREATE VIEWと同じ動作となり、ビューを作成します。ビューが作成済みの場合はALTER VIEWと同じ動作となり、存在するビューに対する抽出条件を変更することができます。 CREATE OR REPLACEの使い方はCREATE VIEWおよびALTER VIEWと同じです。 構文: CREATE OR REPLACE VIEW ビュー名 AS SELECT文のステートメント;
なおPostgreSQLではALTERをビューの補助属性を変更する目的で用います。PostgreSQLのCREATE OR REPLACE VIEWは同等の機能が提供されています。そのためビューの定義を更新する際にはCREATE OR REPLACE VIEWを用いてビューの変更を行います。
ビューの更新方法
これまでにビューの参照を中心に説明してきました。ビューの更新はINSERT文・UPDATE文・DELETE文を用います。
なお、以下のビューでは更新することができませんのでご注意ください。 更新データが特定できない可能性がある場合: ・DISTINCTを利用したビューの場合 変更行が特定できないため更新できません。 ・集計関数とGROUP BY句やHAVING句を利用したビューの場合 集約値は直接変更できません。 ・複数テーブルを統合したビューの場合 複数テーブルは直接変更できません。
同様に明示的に書き込み不可としている場合も、更新することができません。 明示的に書き込み不可としている場合: ・ビューをWITH READ ONLYを指定し、定義した場合 明示的に読み取りとしているため更新できません。
ビューのテーブル結合の方法
テーブル結合はJOIN句を用いることにより抽出できます。必要に応じて内部結合(INNER JOIN)・左外部結合(LEFT OUTER JOIN)・右外部結合(RIGHT OUTER JOIN)・全外部結合(FULL OUTER JOIN)・交差結合(CROSS JOIN)を選択あるいは複合して利用します。
各結合の違いは以下のように分類されます。 ・内部結合(INNER JOIN) テーブルそれぞれに存在する行を抽出します。 ・左外部結合(LEFT OUTER JOIN) 左テーブルに存在する行のみ抽出、右テーブルに存在しない場合は空白とします。 ・右外部結合(RIGHT OUTER JOIN) 右テーブルに存在する行のみ抽出、左テーブルに存在しない場合は空白とします。 ・全外部結合(FULL OUTER JOIN) テーブルいずれかに存在する行を抽出、いずれかのテーブルに存在しない場合は空白とします。 ・交差結合(CROSS JOIN) テーブルの抽出数の組み合わせ数すべてを抽出します。
また、複数のテーブルを結合する際にはテーブル結合条件をON句で記述します。 使用例:テーブルIDが共通のテーブルaとテーブルから抽出データを取込む例 CREATE VIEW ビュー名 AS SELECT 抽出データ,, FROM テーブルa JOIN テーブルb ON USING(テーブルID) ;
ビューの詳細情報の確認方法
ビューの詳細情報の確認方法は、DBMSの実装によって異なります。以下に代表的なDBMSのビューの定義の確認方法をまとめておきます。
・Oracleの場合 USER_VIEWを検索することで定義内容を確認することができます。 用法: SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME = "ビュー名"; ・MySQLの場合 SHOW CREATE VIEWで定義内容を確認することができます。 用法: SHOW CREATE VIEW ビュー名 ・PostgreSQLの場合 pg_viewsからdefinitionを抽出することで定義内容を確認することができます。 用法: SELECT definition FROM pg_views WHERE viewname = ‘ビュー名'; ・SQLServerの場合 information_schema.viewsを抽出することで定義内容を確認することができます。 用法: SELECT * FROM information_schema.views WHERE TABLE_NAME = 'ビュー名';
SQLのビューを使ってSQL文を効果的に使用しましょう
SQLのビューは繰り返し発生するSELECT文を単純化することが可能です。さらに実データが伴わない仮想テーブルですので、セキュリティリスクが低減できます。1度ビューを作成すると他の抽出でも転用できますので、ビューを活用しSQL文を効率的に使用することをおすすめします。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから