mysql之视图(1)

知识点:

  1. 视图定义
  2. 创建、更新、删除视图语法
  3. 视图的作用
  4. 视图的优缺点

一.视图定义

视图就是存储在数据库中并具有名字的 SQL 语句,或者说是以预定义的 SQL 查询的形式存在的数据表的成分。

视图可以包含表中的所有列,或者仅包含选定的列。视图可以创建自一个或者多个表,这取决于创建该视图的 SQL 语句的写法。

视图,一种虚拟的表,允许用户执行以下操作:

  • 以用户或者某些类型的用户感觉自然或者直观的方式来组织数据;
  • 限制对数据的访问,从而使得用户仅能够看到或者修改(某些情况下)他们需要的数据;
  • 从多个表中汇总数据,以产生报表。

二.创建、更新、删除、查看视图语法

1.创建视图

数据库视图由 CREATE VIEW 语句创建。视图可以创建自单个表、多个表或者其他视图。

要创建视图的话,用户必须有适当的系统权限。具体需要何种权限随数据库系统实现的不同而不同。

CREATE VIEW 语句的基本语法如下所示:

CREATE VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];

和普通的 SQL SELECT 查询一样,你可以在上面的 SELECT 语句中包含多个数据表。

2.更新视图

视图可以在特定的情况下更新:

  • SELECT 子句不能包含 DISTINCT 关键字
  • SELECT 子句不能包含任何汇总函数(summary functions)
  • SELECT 子句不能包含任何集合函数(set functions)
  • SELECT 子句不能包含任何集合运算符(set operators)
  • SELECT 子句不能包含 ORDER BY 子句
  • FROM 子句中不能有多个数据表
  • WHERE 子句不能包含子查询(subquery)
  • 查询语句中不能有 GROUP BY 或者 HAVING
  • 计算得出的列不能更新
  • 视图必须包含原始数据表中所有的 NOT NULL 列,从而使 INSERT 查询生效。

如果视图满足以上所有的条件,该视图就可以被更新。下面的例子中,Ramesh 的年龄被更新了:

SQL > UPDATE CUSTOMERS_VIEW
      SET AGE = 35
      WHERE name='Ramesh';

最终更新的还是原始数据表,只是其结果反应在了视图上。

向视图中插入新行:

可以向视图中插入新行,其规则同(使用 UPDATE 命令)更新视图所遵循的规则相同。

这里我们不能向 CUSTOMERS_VIEW 视图中添加新行,因为该视图没有包含原始数据表中所有 NOT NULL 的列。否则的话,你就可以像在数据表中插入新行一样,向视图中插入新行。

删除视图中的行:

视图中的数据行可以被删除。删除数据行与更新视图和向视图中插入新行遵循相同的规则。

下面的例子将删除 CUSTOMERS_VIEW 视图中 AGE=22 的数据行:

SQL > DELETE FROM CUSTOMERS_VIEW
      WHERE age = 22;

该语句最终会将原始数据表中对应的数据行删除,只不过其结果反应在了视图上。

3.WITH CHECK OPTION

WITH CHECK OPTION 是 CREATE VIEW 语句的一个可选项。WITH CHECK OPTION 用于保证所有的 UPDATE 和 INSERT 语句都满足视图定义中的条件。

如果不能满足这些条件,UPDATE 或 INSERT 就会返回错误。

下面的例子创建的也是 CUSTOMERS_VIEW 视图,不过这次 WITH CHECK OPTION 是打开的:

CREATE VIEW CUSTOMERS_VIEW AS
SELECT name, age
FROM  CUSTOMERS
WHERE age IS NOT NULL
WITH CHECK OPTION;

这里 WITH CHECK OPTION 使得视图拒绝任何 AGE 字段为 NULL 的条目,因为视图的定义中,AGE 字段不能为空。

4.删除视图

DROP VIEW [IF EXISTS]
    view_name [, view_name] ...
    [RESTRICT | CASCADE]

DROP VIEW能够删除1个或多个视图。必须在每个视图上拥有DROP权限。

可以使用关键字IF EXISTS来防止因不存在的视图而出错。给定了该子句时,将为每个不存在的视图生成NOTE。

如果给定了RESTRICT和CASCADE,将解析并忽略它们。

5.其他

1.ALTER VIEW语法

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

该语句用于更改已有视图的定义。其语法与CREATE VIEW类似。该语句需要具有针对视图的CREATE VIEW和DROP权限,也需要针对SELECT语句中引用的每一列的某些权限。
2.SHOW CREATE VIEW语法 ,该语句给出了1个创建给定视图的CREATE VIEW语句。

三.视图的作用

  1. 提高了数据的安全性,有定义可以看出,用户只能访问与自己相关的数据。
  2. 提高了数据的独立性

四.视图的优缺点(原文地址:http://wl-ldy.iteye.com/blog/944898

视图的优点: 

  1. 可以定制用户数据,聚焦特定的数据。  
    解释:在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话, 采购人员,可以需要一些与其有关的数据,而与他无关的数据,对他没有任何意义,我们可以根据这一实际情况,专门为采购人员创建一个视图,以后他在查询数据时,只需select  *  from  view_caigou   就可以啦。  
  2. 可以简化数据操作。  
    解释:我们在使用查询时,在很多时候我们要使用聚合函数,同时还要显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我  们只需要select  *  from  view1就可以啦,这样很方便。  
  3. 基表中的数据就有了一定的安全性  
    解释:因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以  将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集  合,数据是随着基表的更新而更新。同时,用户对视图,不可以随意的更改和删除,可以保证数据的安全性。  
  4. 可以合并分离的数据,创建分区视图  
    解释:随着社会的发展,公司的业务量的不断的扩大,一个大公司,下属都设有很  多的分公司,为了管理方便,我们需要统一表的结构,定期查看各公司业务  情况,而分别看各个公司的数据很不方便,没有很好的可比性,如果将这些 数据合并为一个表格里,就方便多啦,这时我们就可以使用union关键字, 将各分公司的数据合并为一个视图。 

视图的缺点: 

  1. 性能差sql server必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,sql server也要把它变成一个复杂的结合体,需要花费一定的时间。 
  2. 修改限制当用户试图修改试图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的试图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。

猜你喜欢

转载自blog.csdn.net/yiguang_820/article/details/82664906
今日推荐