1.4 使用视图的原因
1.一个视图可以展示计算结果
2.视图可以限制某些展现的列
3.视图可以用来选择数据重多个表中
4.视图可以用来展示对于不同的用户展示不同的内容
5.如果你没有改变表的结构来适应可能的应用程序,视图可以保存元素表结构来最小化损坏其他的应用程序。
14.2 创建视图
create [or replace ] [algorithm=algorithm_type]
view view_name[(column_list)]
as select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
select_statement是选择语句它表明真有获取数据党视图。
可选的部分:
1.or replace 语句引起任何存的视图作为新的而抛弃原来的
2. algorithm指明算法
3.column_list提供视图列的名字来覆盖默认的名字
4.当WITH CHECK OPTION语句被包含在视图定义中,所有数据的改变来确保新的或改变满足视图定义的条件。如果条件没有被满足,改变不会被接收。
create View CityView as SElect ID,Name From city;
如果一个视图名字已经存在会产生错误,避免create or replace view cityview as select id,name from city;
重新定义视图列的理由:
1. 视图列名字必须是唯一的,create View v (CountryName,cityName) as select Country.name,city.name from Country ,city where code=countryCOee;
2.明确定义列明可以使他更容易使用列。ceate view CountryLangCount as select Name,Count(Language) From Country ,.........改变为
create view CountryLangCount (Name,LangCount) as select name,count(Language) from country,countryLanguage where code=countrycode gruop by name;另外的一种方式是在选择是使用别名:
selecte Name ,count(Language) as langCount
使用视图的注意:
1.一个视图定义是使用where,当使用视图是也是用了where就是两个where的组合
2.如果一个视图定义包含orderby语句,它被用于排序视图结果除非引用视图是包含了它自己的ordery by语句。在这种情况下,视图定义order by被忽略
3.对于一些选项,如HIGH——priority ,可以设置忽略视图的选项
14.2.1 视图的限制
1.不能创建临时视图
2.不能创建触发器到一个视图
3.表在视图必须基于已经存在的表
4.在创建视图是的选择不能包含下面的条件:1.子查询在FROM语句中 2.引用TEMPORARY表 3.引用用户变量 4.引用过程从那时,如果视图定义发生在一个存储过程 5.引用预处理语句
14.2.2 View算法
Algorith={undefined|Merge|Temptable}对于Undefined ,Mysql自己选择算法
对于MERGE,mysql处理语句执行合并的结果,查询条件AND
对于TEMPTABLE,MYSQL处理语句应用视图获取视图内容到一个临时表,然后使用临时表到完成执行语句。
这MERGE算法需要一对一的,如果来自多个表不能使用merge算法。
对于含有聚合函数和子查询的通过创建临时表来满足。
当创建视图是没有必要指定算法
14.2.3 更新视图
如果含有聚合函数时无法更新,必须是一个视图对于一个表时才可以使用更新,必须是简单的应用而不是表达式。
1.视图可以被更新是where语句仍旧满足条件
2. insert满足是where语句对于新行仍旧满足
如果算法ALGORITH=TEMPTABLE时,with check option是排他性的,因为TEMPTABLE让视图没有更新
14.3 更新视图
alter view largePop as select name,population from countryPop where population >=10000000;
14.4 删除视图
drop view [IF EXISTS] view_name [, view_name]...;
drop view IF Exists v1,v2;
14.5 检测视图
创建视图是,基于的表或列必须存在 check table来检测
14.6 获取视图的属性数据
select * from information_schema.views
where table_name='CityView'
AND table_schema='world'\G
>show create view cityView
14.7特权
1.对于表的列,你必须有获取列的特权,例如select ,insert或者update
2.对于访问的列,例如在一个where或者group by语句,你必须有选择的特权
对于使用or replace语句值一个粗昂及语句或使用alter必须有删除drop的特权
如果你有了更新视图的特权,但是并不意味着你可以直接更新表,show create view语句需要select特权。如果视图定义对于表你没有特权,你必须有show view特权除了select外。