天天看点

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