SQLで利用されるビューのメリットデメリットと作成方法、使い方について紹介していきます
ビュー(view)とは
ビュー(view)とは仮想的なテーブルのことです。実際にデータが保存されているわけではなく、作成時に定義したselect文が保存されています。
メリット
ビューを利用するメリットについて紹介していきます
- SQLのコードをシンプルにすることができる
- セキュリティ性を高める
ひとつずつ解説していきます。
SQLのコードをシンプルにすることができる
複雑なテーブル結合などで長文のコードになる場合、そのようなコードを毎回記述するのはとても面倒です。
そんなときに、よく利用するselect文をビュー(view)として設定することで、そのビューを呼び出すだけでデータを確認することができるようになります。
セキュリティ性を高める
データベースには気密性の高い情報が多く登録されています。外部からも多くの企業が出入りするプロジェクトで、すべての作業者が常にどのデータにもアクセスできるようになっていると情報漏洩のリスクも高まります。
そのようなことが無いようにあらかじめアクセスできる情報を制限することで情報漏洩のリスクを下げることができます。
デメリット
ビューを利用するデメリットについて紹介していきます
- メモリ領域を圧迫してパフォーマンス低下させる可能性がある
- データ情報の更新に制限がある
メモリ領域を圧迫してパフォーマンス低下させる可能性がある
ビューはあくまで複雑なselect文に別名を付けただけのものです。簡易的に利用できていてもそれはSQL文が簡単になっているだけで、なかでは複雑な処理が行われています。
そのような状態でさらに、設定したビューを使ったコードに対してさらにビューを設定したり、where句などで条件を指定したりするとパフォーマンスが下がる可能性があります。
データ情報の更新に制限がある
データベースを更新する『insert,update,delete』などを利用する場合にいくつかの条件を満たしている必要があります。
条件は以下となります
- select句にdistinctが使用されていない
- group by句を使用していない
- havin句を使用していない
- 集約されたビューではないこと
- from句に含まれるテーブルが一つであること
基本的には一つのテーブルにのみ影響を与える場合に限って更新( insert,update,delete )を行うことができます
ビュー(view)の作成方法
ビューの作成方法について紹介していきます
構文
create view ビューの名前(カラム名1,カラム名2,...)
as
ビューに設定するselect文;
コードの見方
前提条件
ユーザー管理をしているUSERSテーブルと都道府県一覧を管理しているprefectureテーブルを結合してデータを取得するselect文をビューとして設定します。
使用するテーブル:usersテーブルとprefectureテーブル
usersテーブル
+----+----------+------+------------------+--------+---------------+
| id | last_name| age | email | gender | prefecture_id |
+----+----------+------+------------------+--------+---------------+
| 1 | 柴犬 | 7 | shibainu@dog.com | 1 | 13 |
| 2 | コーギー | 8 | corgi@dog.com | 1 | 42 |
| 3 | ダックス | 10 | daks@dog.com | 2 | 11 |
| 4 | パグ | 3 | pug@dog.com | 2 | 10 |
| 5 | シーズー | 17 | shi-tzu@dog.com | 2 | 11 |
| 6 | 秋田犬 | 12 | akitainu@dog.com | 1 | 5 |
+----+----------+------+------------------+--------+---------------+
6 rows in set (0.000 sec)
prefectureテーブル
+----+----------+--------------+
| id | name | name_kana |
+----+----------+--------------+
| 1 | 北海道 | ホッカイドウ |
| 2 | 青森県 | アオモリケン |
| 3 | 岩手県 | イワテケン |
| ・ | ・ | ・ |
| ・ | ・ | ・ |
| ・ | ・ | ・ |
| 47 | 沖縄県 | オキナワケン |
+----+----------+--------------+
47 rows in set (0.001 sec)
条件
- usersテーブルのprefecture_idとprefectureテーブルのidを紐づける
- usersテーブルの情報を取得する際にprefecture_idではなく県名(prefectureテーブルのnameカラム)を表示させる
- 取得するカラム
usersテーブル:id,last_name
prefectureテーブル:name
prefecture_idの値と都道府県名の紐づけ
- 13 ⇒ 東京都
- 42 ⇒ 長崎県
- 11 ⇒ 埼玉県
- 10 ⇒ 群馬県
- 5 ⇒ 秋田県
使用するSQL文
select users.id,last_name,name from
users
inner join prefecture on
users.prefecture_id = prefecture.id;
出力結果
+----+-----------+--------+
| id | last_name | name |
+----+-----------+--------+
| 1 | 柴犬 | 東京都 |
| 2 | コーギー | 長崎県 |
| 3 | ダックス | 埼玉県 |
| 4 | パグ | 群馬県 |
| 5 | シーズー | 埼玉県 |
| 6 | 秋田犬 | 秋田県 |
+----+-----------+--------+
6 rows in set (0.001 sec)
実際にビューを作成してみる
前提条件で提示したselect文をビューとして登録していきます。
使用するSQL文
create view prefecture_join(id,last_name,prefecture)
as
select users.id id,last_name,name prefecture from
users
inner join prefecture on
users.prefecture_id = prefecture.id;
出力結果
Query OK, 0 rows affected (0.010 sec)
登録した場合には特別な記載はなく、クエリが実行されたことだけがわかります。
ビュー(view)の使い方
ビューの使い方について紹介していきます
構文
select * from ビューの名前;
使用するSQL文
select * from prefecture_join;
登録したビューを表示させてみます。
先ほどビュー名として登録した『prefecture_join』を指定します。
ほかの文については特別な記載はなくテーブルを指定したSQL文と同様に扱うことができます。
出力結果
+----+-----------+------------+
| id | last_name | prefecture |
+----+-----------+------------+
| 1 | 柴犬 | 東京都 |
| 2 | コーギー | 長崎県 |
| 3 | ダックス | 埼玉県 |
| 4 | パグ | 群馬県 |
| 5 | シーズー | 埼玉県 |
| 6 | 秋田犬 | 秋田県 |
+----+-----------+------------+
6 rows in set (0.001 sec)
先ほどの出力結果と同じ結果になりました。
このようにビューを利用することで複雑なSQL文を短くして扱うことができるようになります。
おまけ:ビュー(view)の削除
ビューの削除の方法について紹介します。
構文
dorp view ビューの名前;
使用するSQL文
dorp view prefecture_join;
先ほど作成したビュー(prefecture_join)を削除してみます。
出力結果
Query OK, 0 rows affected (0.008 sec)
登録した場合には特別な記載はなく、クエリが実行されたことだけがわかります。