上一張内容在結尾階段引入了MySQL資料庫的視圖概念,本章将纖細介紹視圖的集中用法。在建立視圖之前先建立學生表,學院表和學員資訊表,通過使用視圖對着三張表的操作,使我們對視圖有一個基本的認識和了解。
使用視圖的原則:
1、視圖名字唯一性
2、視圖的建立個數不受限制,使用者可以建立多個視圖
3、使用者建立視圖,必須從資料庫管理者得到權限。
4、視圖可以嵌套,
5、一些資料庫管理系統禁止使用者在查詢語句中使用order by子句。
一、建立實用表資料
建立學生表
<code>mysql> </code><code>create</code> <code>table</code> <code>studenginfo(sno </code><code>int</code><code>(4) zerofill,sname </code><code>varchar</code><code>(18),sex ENUM(</code><code>'男'</code><code>,</code><code>'女'</code><code>) </code><code>not</code> <code>null</code> <code>default</code> <code>'女'</code><code>,address </code><code>varchar</code><code>(48) </code><code>default</code> <code>'北京'</code><code>,dno </code><code>int</code><code>(3));</code>
<code>Query OK, 0 </code><code>rows</code> <code>affected (0.07 sec)</code>
建立學院表
<code>create</code> <code>table</code> <code>recruitinfo(address </code><code>varchar</code><code>(18) </code><code>not</code> <code>null</code><code>,score </code><code>float</code> <code>not</code> <code>null</code><code>,snum </code><code>int</code><code>(3) </code><code>not</code> <code>null</code><code>);</code>
<code>Query OK, 0 </code><code>rows</code> <code>affected (0.08 sec)</code>
<code>mysql> show </code><code>create</code> <code>table</code> <code>department\G;</code>
<code>*************************** 1. row ***************************</code>
<code> </code><code>Table</code><code>: department</code>
<code>Create</code> <code>Table</code><code>: </code><code>CREATE</code> <code>TABLE</code> <code>`department` (</code>
<code> </code><code>`dno` </code><code>int</code><code>(2) </code><code>NOT</code> <code>NULL</code><code>,</code>
<code> </code><code>`dname` </code><code>varchar</code><code>(18) </code><code>NOT</code> <code>NULL</code><code>,</code>
<code> </code><code>`dnum` </code><code>int</code><code>(3) </code><code>NOT</code> <code>NULL</code> <code>DEFAULT</code> <code>'0'</code>
<code>) ENGINE=InnoDB </code><code>DEFAULT</code> <code>CHARSET=utf8</code>
<code>1 row </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
為學生表建立索引
<code>mysql> </code><code>create</code> <code>index</code> <code>name_index </code><code>on</code> <code>studentinfo (sname);</code>
二、視圖:
視圖作為查詢資料的另外一種形式,利用視圖,使用者可以集中、簡化和定制資料庫,同時提供了安全保證
視圖是從一個或過個表中導出的表,其結構和資料是建立在對标的查詢基礎之上的。就本質而言,視圖是一張虛表。
視圖建立文法:
<code>create</code> <code>view</code> <code><view_name> [column1,column2...] </code><code>as</code>
<code>select</code> <code><column_name> </code><code>from</code> <code><tb_name>;</code>
其中[column1,column2,...]為可選項,預設是子查詢結果中的字段名,select語句指明了視圖中的字段機器資料。
強調:
1、視圖建立後,隻在資料字典中存放視圖的定義,而其中的select語句并不執行
2、隻有當使用者對視圖進行操作時,才按照視圖的定義将資料從基本表中取出。
建立視圖:
1、建立一個與studentinfo相同資訊的視圖
<code>mysql> </code><code>create</code> <code>view</code> <code>studentinfo_view </code><code>as</code> <code>select</code> <code>* </code><code>from</code> <code>studentinfo;</code>
<code>select</code> <code>* </code><code>from</code> <code>studentinfo_view;</code>
2、為視圖建立視圖
<code>mysql> </code><code>create</code> <code>view</code> <code>boy_view </code><code>as</code> <code>select</code> <code>* </code><code>from</code> <code>studentinfo_view </code><code>where</code> <code>sex=</code><code>'男'</code><code>;</code>
3、為列建立視圖并檢視其資訊
<code>mysql> </code><code>create</code> <code>view</code> <code>nameaddress_view </code><code>as</code> <code>select</code> <code>sname,address </code><code>from</code> <code>studentinfo;</code>
4、建立與表具有不同字段名的視圖
<code>mysql> </code><code>create</code> <code>view</code> <code>New_view(boy_name,boy_address) </code><code>as</code> <code>select</code> <code>sname,address </code><code>from</code> <code>studentinfo </code><code>where</code> <code>sex=</code><code>'男'</code><code>;</code>
<code>Query OK, 0 </code><code>rows</code> <code>affected (0.00 sec)</code>
5、利用視圖簡化表的複雜連接配接
建立一個關于學生資訊表(studentinfo)、招生資訊表(Recruitinfo)和Department的關聯。
sname、dname和dnum三個字段。
<code>mysql> </code><code>create</code> <code>view</code> <code>join_view </code><code>as</code> <code>select</code> <code>sname,dname,score </code><code>from</code> <code>studentinfo s,department d,recruitinfo r </code><code>where</code> <code>s.address=r.address </code><code>and</code> <code>s.dno=d.dno;</code>
<code>mysql> </code><code>select</code> <code>* </code><code>from</code> <code>join_view;</code>
<code>+</code><code>-----------+--------------------+-------+</code>
<code>| sname | dname | score |</code>
<code>| 張平 | 汽車系 | 648.5 |</code>
<code>| 李山 | 電子工程系 | 560 |</code>
<code>| 王彤 | 汽車系 | 654.5 |</code>
<code>| 張偉 | 計算機工程系 | 638 |</code>
<code>| 高守傳 | 機械工程 | 650 |</code>
<code>| 劉紅 | 工程實體系 | 629.5 |</code>
<code>| 張勇 | 應用數學系 | 625 |</code>
<code>| 劉曉 | 電子工程系 | 650 |</code>
<code>| 吳軍 | 電子工程系 | 631 |</code>
<code>| 張大山 | 材料工程系 | 635 |</code>
<code>10 </code><code>rows</code> <code>in</code> <code>set</code> <code>(0.03 sec)</code>
6、視圖簡化複雜查詢的過程
6.1 給予學生表,建立boys_view視圖,包含所有男同學資訊
<code>mysql> </code><code>create</code> <code>view</code> <code>boys_view </code><code>as</code> <code>select</code> <code>* </code><code>from</code> <code>studentinfo </code><code>where</code> <code>sex=</code><code>'男'</code><code>;</code>
給予recruitinfo表,建立視圖score_view,包含錄取分數高于630的所有學生的資訊
<code>mysql> </code><code>create</code> <code>view</code> <code>boyscore_view </code><code>as</code> <code>select</code> <code>* </code><code>from</code> <code>score_view </code><code>where</code> <code>sno </code><code>in</code> <code>(</code><code>select</code> <code>sno </code><code>from</code> <code>boys_view);</code>
<code>mysql> </code><code>select</code> <code>* </code><code>from</code> <code>boyscore_view;</code>
<code>+</code><code>------+-----------+-----+---------+------+</code>
<code>| sno | sname | sex | address | dno |</code>
<code>| 0005 | 高守傳 | 男 | 山東 | 3 |</code>
<code>| 0004 | 張偉 | 男 | 浙江 | 1 |</code>
<code>| 0009 | 吳軍 | 男 | 山西 | 4 |</code>
<code>| 0010 | 張大山 | 男 | 陝西 | 7 |</code>
<code>4 </code><code>rows</code> <code>in</code> <code>set</code> <code>(0.00 sec)</code>
<code>mysql> </code><code>create</code> <code>view</code> <code>result_view (sname,dname) </code><code>as</code> <code>select</code> <code>boyscore_view.sname,department.dname </code><code>from</code> <code>boyscore_view,department </code><code>where</code> <code>boyscore_view.dno=department.dno;</code>
删除視圖
文法:drop view view_name
drop view studentinfo_view
注意:視圖在實體上是不存在的,隻是一個查詢結果,是一個被存儲的查詢。create view語句隻是儲存了視圖的定義,是以在使用drop view語句删除視圖時,删除的也隻是視圖的定義,對實際表中的資料沒有影響。
本文轉自 CARYFLASH 51CTO部落格,原文連結:http://blog.51cto.com/maoxiaoxiong/1983954