<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[BIWEB开源PHP WMS系统创始人ArthurXF肖飞的blog]]></title> 
<link>http://www.bizeway.net/index.php</link> 
<description><![CDATA[网务通 - 网务公司发展之路]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[BIWEB开源PHP WMS系统创始人ArthurXF肖飞的blog]]></copyright>
<item>
<link>http://www.bizeway.net/read.php?</link>
<title><![CDATA[MySQL笔记之视图的使用详解]]></title> 
<author>ArthurXF &lt;arthurxf@gmail.com&gt;</author>
<category><![CDATA[MySQL]]></category>
<pubDate>Mon, 30 Dec 2013 17:41:31 +0000</pubDate> 
<guid>http://www.bizeway.net/read.php?</guid> 
<description>
<![CDATA[ 
	使用视图的大部分情况是为了保障数据安全性，提高查询效率 <br/>什么是视图 <br/><br/>视图是从一个或多个表中导出来的表，是一种虚拟存在的表。<br/><br/>视图就像一个窗口，通过这个窗口可以看到系统专门提供的数据。<br/><br/>这样，用户可以不用看到整个数据库中的数据，而之关心对自己有用的数据。<br/><br/>数据库中只存放了视图的定义，而没有存放视图中的数据，这些数据存放在原来的表中。<br/><br/>使用视图查询数据时，数据库系统会从原来的表中取出对应的数据。<br/><br/>视图中的数据依赖于原来表中的数据，一旦表中数据发生改变，显示在视图中的数据也会发生改变。<br/><br/> <br/><br/>视图的作用 <br/><br/>1.使操作简单化，可以对经常使用的查询定义一个视图，使用户不必为同样的查询操作指定条件<br/><br/>2.增加数据的安全性，通过视图，用户只能查询和修改指定的数据。<br/><br/>3.提高表的逻辑独立性，视图可以屏蔽原有表结构变化带来的影响。<br/><br/> <br/><br/>总而言之，使用视图的大部分情况是为了保障数据安全性，提高查询效率<br/><br/> <br/><br/>参考表：<br/><br/><br/><br/><br/><br/>创建视图的语法<br/><br/><br/>复制代码 代码如下:<br/>CREATE [ALGORITHM]={UNDEFINED&#124;MERGE&#124;TEMPTABLE}]<br/> &nbsp; &nbsp; &nbsp; VIEW 视图名 [(属性清单)]<br/> &nbsp; &nbsp; &nbsp; AS SELECT 语句<br/> &nbsp; &nbsp; &nbsp; [WITH [CASCADED&#124;LOCAL] CHECK OPTION];<br/><br/>ALGORITHM表示视图选择的算法（可选参数）<br/><br/> &nbsp; &nbsp;　　UNDEFINED：MySQL将自动选择所要使用的算法<br/> &nbsp; &nbsp;　　MERGE：将视图的语句与视图定义合并起来，使得视图定义的某一部分取代语句的对应部分<br/> &nbsp; &nbsp;　　TEMPTABLE：将视图的结果存入临时表，然后使用临时表执行语句<br/><br/>视图名表示要创建的视图的名称<br/><br/>属性清单表示视图中的列名，默认与SELECT查询结果中的列名相同（可选参数）<br/><br/>WITH CHECK OPTION表示更新视图时要保证在该试图的权限范围之内（可选参数）<br/><br/> &nbsp; &nbsp;　　CASCADED：更新视图时要满足所有相关视图和表的条件<br/> &nbsp; &nbsp;　　LOCAL：更新视图时，要满足该视图本身定义的条件即可<br/><br/> <br/><br/>tips：创建试图时最好加上WITH CASCADED CHECK OPTION参数，这种方式比较严格<br/><br/>　　 &nbsp; 可以保证数据的安全性<br/><br/><br/>视图操作<br/>在单表上创建视图<br/><br/><br/>复制代码 代码如下:<br/>mysql> CREATE VIEW work_view(ID,NAME,ADDR) AS SELECT id,name,address FROM work; &nbsp;<br/>Query OK, 0 rows affected (0.05 sec)<br/><br/>此处work_view为视图名，后面括号内的参数代表视图中的列<br/><br/>AS表示将后面SELECT 语句中的查询结果赋给前面的视图中<br/><br/>在多表上创建视图<br/><br/><br/>复制代码 代码如下:<br/>mysql> CREATE ALGORITHM=MERGE VIEW work_view2(ID,NAME,SALARY)<br/> &nbsp; &nbsp;-> AS SELECT work.id,name,salary FROM work,salary<br/> &nbsp; &nbsp;-> WHERE work.id=salary.id<br/> &nbsp; &nbsp;-> WITH LOCAL CHECK OPTION;<br/>Query OK, 0 rows affected (0.02 sec)<br/><br/>在多表中创建视图需要两表有指定联系，如上面的work.id=salary.id<br/><br/><br/>SELECT查询视图<br/><br/><br/>复制代码 代码如下:<br/>mysql> SELECT * FROM work_view;<br/>+----+--------+--------+<br/>&#124; ID &#124; NAME &nbsp; &#124; ADDR &nbsp; &#124;<br/>+----+--------+--------+<br/>&#124; &nbsp;1 &#124; 张三 &nbsp; &#124; 北京 &nbsp; &#124;<br/>&#124; &nbsp;2 &#124; 李四 &nbsp; &#124; 上海 &nbsp; &#124;<br/>&#124; &nbsp;3 &#124; 王五 &nbsp; &#124; 湖南 &nbsp; &#124;<br/>&#124; &nbsp;4 &#124; 赵六 &nbsp; &#124; 重庆 &nbsp; &#124;<br/>+----+--------+--------+<br/> rows in set (0.00 sec)<br/><br/>此处的SELECT语句用法和其他表中的用法一样<br/><br/>别忘了，视图也是一张表，只不过它是虚拟的<br/><br/><br/>DESCRIBE查看视图基本信息<br/><br/><br/>复制代码 代码如下:<br/>mysql> DESCRIBE work_view;<br/>+-------+-------------+------+-----+---------+-------+<br/>&#124; Field &#124; Type &nbsp; &nbsp; &nbsp; &nbsp;&#124; Null &#124; Key &#124; Default &#124; Extra &#124;<br/>+-------+-------------+------+-----+---------+-------+<br/>&#124; ID &nbsp; &nbsp;&#124; int(10) &nbsp; &nbsp; &#124; NO &nbsp; &#124; &nbsp; &nbsp; &#124; NULL &nbsp; &nbsp;&#124; &nbsp; &nbsp; &nbsp; &#124;<br/>&#124; NAME &nbsp;&#124; varchar(20) &#124; NO &nbsp; &#124; &nbsp; &nbsp; &#124; NULL &nbsp; &nbsp;&#124; &nbsp; &nbsp; &nbsp; &#124;<br/>&#124; ADDR &nbsp;&#124; varchar(50) &#124; YES &nbsp;&#124; &nbsp; &nbsp; &#124; NULL &nbsp; &nbsp;&#124; &nbsp; &nbsp; &nbsp; &#124;<br/>+-------+-------------+------+-----+---------+-------+<br/> rows in set (0.00 sec)<br/><br/>与以往一样，此处的DESCRIBE可以简写为DESC<br/><br/><br/>SHOW TABLE STATUS查看视图基本信息<br/><br/><br/>复制代码 代码如下:<br/>mysql> SHOW TABLE STATUS LIKE 'work_view'&#92;G<br/>*************************** 1. row ***************************<br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Name: work_view<br/> &nbsp; &nbsp; &nbsp; &nbsp; Engine: NULL<br/> &nbsp; &nbsp; &nbsp; &nbsp;Version: NULL<br/> &nbsp; &nbsp; Row_format: NULL<br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Rows: NULL<br/> Avg_row_length: NULL<br/> &nbsp; &nbsp;Data_length: NULL<br/>Max_data_length: NULL<br/> &nbsp; Index_length: NULL<br/> &nbsp; &nbsp; &nbsp;Data_free: NULL<br/> Auto_increment: NULL<br/> &nbsp; &nbsp;Create_time: NULL<br/> &nbsp; &nbsp;Update_time: NULL<br/> &nbsp; &nbsp; Check_time: NULL<br/> &nbsp; &nbsp; &nbsp;Collation: NULL<br/> &nbsp; &nbsp; &nbsp; Checksum: NULL<br/> Create_options: NULL<br/> &nbsp; &nbsp; &nbsp; &nbsp;Comment: VIEW<br/> row in set (0.00 sec)<br/><br/>此处大部分信息显示为NULL，更加说明了视图只是一张虚拟表<br/><br/>如果使用SHOW TABLE STATUS查看一张真实表，结果就不会如此<br/><br/>SHOW CREATE VIEW查看视图详细信息<br/><br/><br/>复制代码 代码如下:<br/>mysql> SHOW CREATE VIEW work_view&#92;G<br/>*************************** 1. row ***************************<br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;View: work_view<br/> &nbsp; &nbsp; &nbsp; &nbsp; Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `work_view` AS select `work`.`id` AS `ID`,`work`.`name` AS `NAME`,`work`.`address` AS `ADDR` from `work`<br/>character_set_client: utf8<br/>collation_connection: utf8_general_ci<br/> row in set (0.00 sec)<br/><br/>尼玛好复杂，这里包含了视图的各个属性<br/><br/>在views表中查看视图详细信息<br/>复制代码 代码如下:<br/>mysql> SELECT * FROM information_schema.views&#92;G<br/>*************************** 1. row ***************************<br/> &nbsp; &nbsp; &nbsp; TABLE_CATALOG: def<br/> &nbsp; &nbsp; &nbsp; &nbsp;TABLE_SCHEMA: person<br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TABLE_NAME: work_view<br/> &nbsp; &nbsp; VIEW_DEFINITION: select `person`.`work`.`id` AS `ID`,`person`.`work`.`name` AS `NAME`,`person`.`work`.`address` AS `ADDR` from `person`.`work`<br/> &nbsp; &nbsp; &nbsp; &nbsp;CHECK_OPTION: NONE<br/> &nbsp; &nbsp; &nbsp; &nbsp;IS_UPDATABLE: YES<br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFINER: root@localhost<br/> &nbsp; &nbsp; &nbsp; SECURITY_TYPE: DEFINER<br/>CHARACTER_SET_CLIENT: utf8<br/>COLLATION_CONNECTION: utf8_general_ci<br/>*************************** 2. row ***************************<br/> &nbsp; &nbsp; &nbsp; TABLE_CATALOG: def<br/> &nbsp; &nbsp; &nbsp; &nbsp;TABLE_SCHEMA: person<br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TABLE_NAME: work_view2<br/><br/>information_schema.views表内包含了所有的视图定义信息<br/><br/>不过，通常使用SHOW CREATE VIEW 更加方便<br/><br/>这里信息太长，没有完全列举……<br/><br/><br/>修改视图<br/><br/>修改视图是指修改数据库中已存在的表的定义，当基本表的某些字段发生改变时，可以通过修改视图来保持视图和基本表之间一致<br/>CREATE OR REPLACE VIEW语句修改视图<br/><br/><br/>复制代码 代码如下:<br/>mysql> CREATE OR REPLACE ALGORITHM=TEMPTABLE<br/> &nbsp; &nbsp;-> VIEW work_view(ID,NAME) <br/> &nbsp; &nbsp;-> AS SELECT id,name FROM work;<br/>Query OK, 0 rows affected (0.03 sec)<br/><br/>话说，CREATE OR REPLACE语句非常灵活<br/><br/>在视图存在的情况下可对视图进行修改，视图不在的情况下可创建视图<br/><br/>其基本用法和CREATE VIEW 几乎一致<br/><br/><br/>ALTER语句修改视图<br/><br/><br/>复制代码 代码如下:<br/>mysql> ALTER VIEW work_view2(NAME,SALARY,ADDR)<br/> &nbsp; &nbsp;-> AS SELECT name,salary,address FROM work,salary<br/> &nbsp; &nbsp;-> WHERE work.id=salary.id;<br/>Query OK, 0 rows affected (0.03 sec)<br/><br/>我这把名字、工资和地址当做字段修改了视图<br/><br/>如果是真实的话，对小偷来说极为方便<br/><br/>更新视图<br/><br/>更新视图是指通过视图来插入、更新和删除表中的数据，以为视图是一个虚拟表，其中木有数据<br/><br/>通过视图更新时，都是转换到基本表来更新<br/><br/><br/>复制代码 代码如下:<br/>mysql> UPDATE work_view2 SET SALARY=5899.00 WHERE NAME='张三';<br/>Query OK, 1 row affected (0.03 sec)<br/>Rows matched: 1 &nbsp;Changed: 1 &nbsp;Warnings: 0<br/><br/>此处语句等价于<br/>复制代码 代码如下:<br/>mysql> UPDATE salary SET salary=5899.00 WHERE id=1;<br/><br/>tips:视图中虽然可以更新数据，但是有很多限制<br/><br/>　　 一般情况下，最好将视图作为查询数据的虚拟表，而不要通过视图更新数据<br/><br/><br/>删除视图<br/><br/>删除视图是指删除数据库中已存在的视图，删除视图时，只能删除视图的定义，不会删除数据<br/><br/><br/>复制代码 代码如下:<br/>mysql> DROP VIEW IF EXISTS work_view;<br/>Query OK, 0 rows affected (0.00 sec)<br/><br/>mysql> DROP VIEW work_view2;<br/>Query OK, 0 rows affected (0.01 sec)<br/><br/><br/>这里的IF EXIST参数用来判断视图是否存在，也可以不写<br/><br/>Tags - <a href="tag.php?tag=mysql" rel="tag">mysql</a>
]]>
</description>
</item><item>
<link>http://www.bizeway.net/read.php?&amp;guid=0#topreply</link>
<title><![CDATA[[评论] MySQL笔记之视图的使用详解]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.bizeway.net/read.php?&amp;guid=0#topreply</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>