程序猿的进阶屋

mysql进阶05(视图)

2018-08-19  本文已影响11人  机智的老刘明同志

为什么要用到视图:

    如果某个子查询结果出现的非常频繁,也就是说要经常拿这个查询结果来做子查询的时候

    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

    必须满足视图的条件,才会更新视图的数据

上一篇下一篇

猜你喜欢

热点阅读