为什么要用到视图:
如果某个子查询结果出现的非常频繁,也就是说要经常拿这个查询结果来做子查询的时候
1)利用视图可以简化查询语句
2)可以进行权限的控制
把表的权限封闭,但是开放相应的视图权限,视图里只开放部分数据列
3)大数据表分表的时候,比如说某表的数据有100万条,那么可以将这个表根据id取余分为多个视图
分为多个视图4)视图是表的查询结果,自然表的数据变了,会影响视图的结果
5)能否对视图进行增删改查的操作?
视图的增删改也会影响表;
但视图并不总是能增删改的;
视图的数据与表的数据一一对应时可以修改
对于视图insert还应该注意:视图必须包含表中没有默认值的列
视图详解
1 视图放在information_schema数据库下的views表里
2 创建视图
create [or replace] [algorithm = {undefind | merge | temptable}] view view_name[(column_list)]
as select_statement [with [cascaded | local ] check option]
创建(或者替换)(算法:合并的执行方法| 临时表的执行方法)一个视图
select_statement是一种select语句,他给出了视图的定义,该语句可从基表或者其他视图进行选择
3 视图的算法
Merge:合并的执行方式,每当执行的时候,先将我们视图的sql语句与外部查询视图的sql语句,混合在一起,最终执行
Temptable:临时表模式,每当查询的时候,将视图所使用的select语句生成一个结果的临时表,再在当前的临时表内进行查询
Undefined: mysql将选择所要使用的算法,如果可能,更倾向于merge,因为如果使用了临时表,视图得不到更新
查看视图
show table status from liuming like 'v_users4'\G
删除视图
删除视图之前,要保证有删除的权限
查看一下root用户的删除权限 select drop_priv from mysql.user where user="root" \G
drop view if exists v_users4 ; 删除视图
有以下情况视图不会更新
聚合函数(SUM(),MIN(),MAX(),COUNT()等)
DISTINCT (去重)
GROUP BY
HAVING
UNION UNION ALL
位于选择列表中的子查询
join
FROM字句中的不可更新视图
where字句中的子查询,引用from字句中的表
algorithm = TEMPTABLE (使用临时表总会使视图称为不可更新的)
with check option
必须满足视图的条件,才会更新视图的数据
网友评论