天天看點

7、MySQL資料庫的視圖操作

上一張内容在結尾階段引入了MySQL資料庫的視圖概念,本章将纖細介紹視圖的集中用法。在建立視圖之前先建立學生表,學院表和學員資訊表,通過使用視圖對着三張表的操作,使我們對視圖有一個基本的認識和了解。

使用視圖的原則:

1、視圖名字唯一性

2、視圖的建立個數不受限制,使用者可以建立多個視圖

3、使用者建立視圖,必須從資料庫管理者得到權限。

4、視圖可以嵌套,

5、一些資料庫管理系統禁止使用者在查詢語句中使用order by子句。

一、建立實用表資料

建立學生表

<code>mysql&gt; </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&gt; 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&gt; </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>&lt;view_name&gt; [column1,column2...] </code><code>as</code>

<code>select</code> <code>&lt;column_name&gt; </code><code>from</code> <code>&lt;tb_name&gt;;</code>

其中[column1,column2,...]為可選項,預設是子查詢結果中的字段名,select語句指明了視圖中的字段機器資料。

強調:

1、視圖建立後,隻在資料字典中存放視圖的定義,而其中的select語句并不執行

2、隻有當使用者對視圖進行操作時,才按照視圖的定義将資料從基本表中取出。

建立視圖:

1、建立一個與studentinfo相同資訊的視圖

<code>mysql&gt; </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&gt; </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&gt; </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&gt; </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&gt; </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&gt; </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&gt; </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&gt; </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&gt; </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&gt; </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