1、什么是视图
视图是虚拟的表,是一个存储的查询,虽然不需要实际的物理存储,但是也被看作是一个数据库对象,对用户来说基本上透明的;它与包含数据的表不一样,它不包含任何列或数据,它只是包含使用时动态检索数据的查询,并且只包含一个SELECT语句(不限制子查询)。视图实际上是由预定义查询形式的表所组成的。
视图与表之间的主要区别在于:表占据物理空间,包含实际的饿数据;而视图不需要物理空间,不包含数据,它只是从表里引用数据。
视图只保存在内存里,而且只需要保存其定义本身(查询语句),也就是说视图所需的空间只是定义语句所需要的。
2、视图的用途
(1)简化数据访问,简化复杂的SQL,对数据库里的数据进行归一化处理,达到重用SQL语句;
(2)对数据进行保护,起到安全的作用,例如只让用户访问部分字段信息;
(3)维护摘要数据;
(4)更改数据格式和表示,视图仅仅是用来查看存储在别处数据的一种设施。
总之,视图具有简单、安全和数据独立的优势。
3、视图的使用
在数据库里,视图的使用方式与表是一样的;当创建一个视图时,实际上是在数据库里执行了一个SELECT语句。
(1)表创建视图
CREATE VIEW view_name AS SELECT * FROM table_name [WHERE exp1] [WITH CHECK OPTION] [GROUP BY]
WITH CHECK OPTION选项的目的是确保全部的UPDATE和INSERT语句满足视图定义里的WHERE条件子句,这样保证了引用的完整性。WITH CHECK OPTION有两个选项,CASCADED和LOCAL,其中CASCADED是默认选项。这两个属性都会检查视图的完整性约束和新视图的定义条件,但是LOCAL不检查底层的表,而CASCADED会检查。所以,现对于来说CASCADED更安全些。
(2)视图创建视图
CREATE view2 AS SELECT * FROM view1;
如果从基表和从另一个视图创建视图具有一样的难度和效率,那么首选从基表创建视图。
(3)视图创建表
CREATE TABLE table_name AS SELECT col1,col2 FROM view_name;
(4)删除视图
DROP VIEW view_name;
(5)更改视图
虽然ANSI SQL不包含ALTER VIEW语句,但是某些实现也会支持它,例如:MySQLSQL ServerOracle,在MySQL的旧版本中还可以通过REPLACE VIEW来修改视图。
(6)查看视图
show tables命令不仅显示表的名字,同时也会显示视图的名字,不存在单独显示视图的show views命令;show table status命令,不但可以显示表的信息,同时也可以显示视图的信息;show create view命令可以查看某个视图的定义,例如:show create view view_name;
(7)使用视图
通过视图来检索数据的时候,若是该条检索语句存在WHERE子句,并且视图定义中也存在WHERE子句,那么前一个WHERE子句会被添加到视图查询中已有的WHERE子句中,以便正确过滤数据。也即是说,一个WHERE子句在视图定义中,另外一个WHERE子句在传递给视图的中,那么这两组WHERE子句会自动合并,并且会放置在视图定义中。
(8)嵌套视图对性能的影响
因为搜索引擎需要分析每一层的视图,所以若视图嵌套的层数越多,那么搜索引擎需要进行更多的分析工作,这样导致性能降低,故最好控制视图的嵌套层数。实际上,大多数搜索引擎无法 确保获得一个完美的执行计划,而只能保证执行一个耗时最短的计划。
4、视图的规则
(1)视图名必须唯一,并在只能创建不存在的视图,视图数目没有限制;
(2)视图可以嵌套,但是要注意性能问题;
(3)视图不能有索引,也不能有关联的触发器或默认值;
(4)有些DBMS禁止在视图中使用ORDER BY子句;
(5)有些DBMS把视图作为只读的查询,禁止将数据写会底层表;
(6)有些DBMS要求返回的列进行命名,若是计算字段的话,那么必须要使用别名;
(7)有些DBMS可以创建这样的视图,即不能进行导致行不再属于视图的插入或更新;
(8)视图权限:
-
- 创建视图必须要有足够的权限;
- 视图由创建者或规划所有者所拥有,视图所有者自动拥有视图的全部权限,并且可以把视图的权限授予其他用户;