视图的概述
视图是一个虚拟表,其查询的数据来自于视图定义时的 as select xx 查询语句。视图的列来自于一个表或多个表,所以视图不可以和表名重名。
数据多用作查询,一般不会通过视图去修改数据。
视图的作用
1.视图能简化用户的操作
我们可以为常用的sql语句创建一个视图,这样我们原来需要连多个表,现在操作一个表就好了。
2.视图能够增加安全性
我们可以给不同的用户定义不同的视图,屏蔽了底层的表结构,从而更好的保护了数据的安全性。降低了如sql注入的风险。
3视图对重构数据库提供了一定程度的逻辑独立性
数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。
视图的创建
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
column_list子句,列出由逗号隔开的ID。column_list中的名称数目必须等于SELECT语句检索的列数。
ALGORITHM可取三个值:MERGE、TEMPTABLE或UNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。
MERGE:直接合并结果集
TEMPTABLE:创建临时表
UNDEFINED:MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。
WITH CHECK OPTION子句中,LOCAL和CASCADED关键字决定了检查测试的范围。LOCAL关键字对CHECK OPTION进行了限制,使其仅作用在定义的视图上,而CASCADED会嵌套的检查前面的视图,如果未给定任一关键字,默认值为CASCADED
如果去除option则可以更新,
使用with check 必须保证更新之后的数据,依旧符合where 条件,能被检索出来。
视图的更新操作限制
视图一般只用来查询,如果是单表的话,也可以进行增删改。但是有如下限制。
1.聚合函数(SUM(), MIN(), MAX(), COUNT()等)。2 2.DISTINCT
3. GROUP BY
4. 4 HAVING
5. UNION或UNION ALL
6. 位于选择列表中的子查询
7.Join
8.FROM子句中的不可更新视图
9. WHERE子句中的子查询,引用FROM子句中的表。
10. 仅引用文字值(在该情况下,没有要更新的基本表)。
11. ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。