第 11 章 视图

来源:互联网 发布:淘宝店铺怎么修改模板 编辑:程序博客网 时间:2024/05/21 19:37

视图在数据库中的作用类似窗户一样。视图也被称为虚拟的表,程序员可以通过视图查看数据库表中的数据,但又不用考虑数据库表的结构关系,并且就算是对数据表做了修改,也不用修改前台程序代码,而只需要修改视图即可。视图即保障了数据的安全性又大大提高了查询效率,所以在数据库程序开发设计中视图被广泛使用。

11.1 视图的定义

视图是一个由查询语句定义数据内容的表,表中的数据内容就是SQL查询语句的结果集,行和列的数据均来自SQL查询语句中使用的数据表。但之所以说视图是虚拟的表,是因为视图并不在数据库中真实存在,而是在引用视图时动态生成的。使用视图和查询数据表优势:

  1. 使用视图简单,操作视图和操作数据表完全是两个概念,用户不用清理数据表之间复杂的逻辑关系,而且将经常使用的SQL数据查询语句定义为视图,可以有效地避免代码重复减少工作量。
  2. 使用视图安全,用户只访问到视图给定的内容集合,这些都是数据表的某些行和列,避免用户直接操作数据表引发的一系列错误。
  3. 使用视图相对独立,应用程序访问是通过视图访问数据库,从而程序和数据表之间被视图分离。如果数据表有变化,完全不用去修改SQL语句,只需要调整视图的定义内容,不用调整应用程序代码。
  4. 复杂的查询需求。可以进行问题分解,然后将创建多个视图获取数据,再将视图联合起来就能得到需要的结果了。
    视图的工作机制:
    当调用视图的时候,才会执行图中的SQL,进行取数据操作。视图的内容没有存储,而是在视图被引用的时候才派生出数据。这样不会占用空间,由于是即时引用,视图的内容与真时表的内容总是一致的。
    提示:视图总是显示最近的数据。每当用户查询视图时,数据库都将重建数据。

11.2 视图的创建、修改和删除

11.2.1 创建视图

创建视图的语法格式如下:
CREATE [ALGORITHM={UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name AS
SELECT column_name(s) FROM table_name
[WITH[CASCADED | LOCAL] CHECK OPTION];
其中,ALGORITHM为可选参数,表示视图选择的算法。UNDEFINED表示MySQL将自动选择所要使用的算法;MERGE表示将视图的语句与视图的定义合并起来,使得视图定义的某一部分去带语句的对应部分;TEMPTABLE表示将视图的结果存入临时表,然后使用临时表执行语句。
view_name为指创建视图的名称,可包含其属性列表。
column_name(s)为指查询的字段,也就是视图的列名。
talbe_name指从那个数据表获取数据,这里也可以从多个表获取数据,格式写法请读者自行参考SQL联合查询。
WITH CHECK OPTION为可选参数,表示更新视图时要保证在视图的权限范围内。CASCADED表示更新视图时要满足所有相关视图和表的条件才进行更新,默认是CASCADED;LOCAL表示更新视图时,要满足该视图本身定义的条件即可更新。
该语句能够创建新的视图,如果给定了OR REPLACE子句,该语句还能替换已有的视图。select_statement是一种SELECT语句,它给出了视图的定义。该语句可从基表或其他视图进行选择。
该语句要求具有针对视图的CREATE VIEW权限,以及针对由SELECT语句选择的每一列上的某些权限。对于SELECT语句中的其他地方使用的列,必须具有SELECT权限。如果还有OR REPLACE子句,必须在视图上具有DROP权限。
**提示:**WITH CHECK OPTION虽是可选属性,但为了数据安全性建议读者使用。
视图定义服从以下限制:

  1. SELECT语句不能包含FROM子句中的子查询;
  2. SELECT语句不能引用系统或用户变量;
  3. SELECT语句不能引用预处理语句参数;
  4. 在存储子程序内,定义不能引用子程序参数或局部变量;
  5. 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。
  6. 在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图;
  7. 在视图定义中命名的表必须存在;
  8. 不能将触发程序与视图关联在一起;
  9. 在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,它将被忽略。
  10. 对于定义中的其他选项或子句,他们将被 增加到引用视图的语句的选项或子句中,但效果未定义。
  11. 如果创键了视图,并通过更改系统变量更改了查询处理环境,会影响从视图获得的的结果。

11.2.2 修改视图

视图的修改是指修改了数据表的定义,当视图定义的数据表字段发生了变化时,需要对视图进行修改来保证查询的正确进行。MySQL使用CREATE OR REPLACE VIEW语句修改视图。在MySQL中,使用CREATE OR REPLACE VIEW语句可以修改视图。视图存在时,可以对视图进行修改;视图不存在时,可以创建视图。语法格式如下:
CREATE OR REPLACE [ALGORITHM={UNDEFINED | MERGE | TEMPTABLE}
VIEW 视图名[(属性清单)]
AS SELECT 语句
[WITH [CASCADED | LOCAL] CHECK OPTION];

  1. ALGORITHM:可选。表示视图选择的算法;
  2. UNDEFINED:表示MySQL将自动选择所要使用的算法;
  3. MERGE:表示将使用视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
  4. TEMPTABLE:表示将视图的结果存入临时表,然后使用临时表执行语句。
  5. 视图名:表示要创建的视图的名称。
  6. 属性清单:可选。指定了视图中各个属性的名词,默认情况下,与SELECT语句中查询的属性相同。
  7. SELECT语句:是一个完整的查询语句,表示从某个表中查出某些满足条件的记录,将这些记录导入视图中。
  8. WITH CHECK OPTION:可选。表示修改视图时要保证在该视图的权限范围内。
  9. CASCADED:可选。表示修改视图时,需要满足跟该视图有关的所有相关视图和表的条件,该参数为默认值。
  10. LOCAL:表示修改视图时,只要满足该视图本身定义的条件即可。
    除了使用CREATE OR REPLACE修改视图外,还可以使用ALTER来进行视图修改,用法类似。这两种方法主要是对视图的结构进行修改,其实MySQL也可以对视图内容进行根性**也就是视图的UPDATE操作,是可以通过视图进行增加、删除、修改数据表中的数据,当然对视图的更新操作实质都是对数据表进行操作。**ALTER语句只能修改已经存在的视图,而CREATE OR REPLACE不仅可以修改已经存在的视图,也可以创建视图。因此通常情况下,最好选择CREATE OR REPLACE。

11.2.3 删除视图

因为视图本身只是一个虚拟表,没有物理文件存在,所以视图的删除并不会删除数据,只是删除掉视图的结构定义。语法如下:
DROP VIEW [IF EXISTS] view_name [, view_name1, view_name2…]

11.3 视图的使用

视图被使用最多的地方就是查询,与普通数据表的SELECT查询没有多大区别。
因为视图使是一种虚拟的数据表,它们的行为和数据表一样,但并不真正包含数据。它们是用底层(真正的)数据表或其他视图定义出来的“假”数据表,用来提供查看数据表数据的另一种方,这通常可以简化应用程序。所以也可以使用SHOW TABLES 的命令查到该视图,并查看视图基本信息。
如果要选取某给定数据表的数据列的一个子集,把它定义为一个简单的视图是最方便的做法。
另外,查看视图的相关信息,还可以使用SHOW CREATE VIEW,如果想要简单查看视图定义的结构,可以使用DESCRIBE命令。

原创粉丝点击