zoukankan      html  css  js  c++  java
  • MySQL学习(十二)

    视图 view
    在查询中,我们经常把查询结果当成临时表来看,
    view是什么?view可以看成一张虚拟表,是表通过某种运算得到的一个投影。
    表的变化会影响到视图
    既然视图只是表的某种查询的投影,所以主要步骤在于查询上,查询的结果命名为视图就可以了。
    创建视图的语法
    CREATE VIEW 视图 AS SELECT 语句;

    mysql> create view stats
        -> as
        -> select cat_id,avg(shop_price) as pj
        -> from goods
        -> group by cat_id
        -> order by pj;
    Query OK, 0 rows affected (0.49 sec)
    

    视图有什么作用?
    1 视图可以简化我们的查询,比如,复杂的统计时,先用视图生成一个中间结果,再查询视图
    2 更精细的权限控制。
    3 数据多,分表时可以用到。

    视图是表的一个影子,探讨表与视图,数据变化时相互影响的关系。
    表的数据变化,要影响到视图的变化
    视图变化了,表如何变?
    视图某种情况下,也是可以修改的,视图的数据和表的数据一一对应,就像函数的映射。表可以推出视图的数据,视图可以推出表的数据。
    视图没有数据文件和索引文件,视图只是一种关系。
    注意
    order by limit得到的结果,与表不是一一对应的。一一对应是指,根据select关系,从表中取出的行,只能计算出视图中确定的一行。反之,视图中任意抽一行,能够反推出表中的确定的一行。

    对于一些简单视图,他在发挥作用的过程中,并没有建立表,而只是把条件存起来,下次查询,把条件一合并,直接去查表。
    思考:相比于建临时表,那个快?
    建表:查询->形成临时表->查询寻临时表
    叠加:合并条件->查询表

    到底要不要建临时表,还是合并语句,有algorithm决定
    algorithm = merge 合并查询语句
    temptable 临时表
    undefined 未定义

    mysql> create view v1
        -> as
        -> select * from goods where shop_price > 300;
    Query OK, 0 rows affected (0.75 sec)
    
    mysql> create algorithm = merge view v2
        -> as
        -> select * from goods where shop_price > 300;
    

    虽然结果上相同,但是v2不是临时表。

    如果拿不准是否建表,可以用undefined,让系统自己做判断。

  • 相关阅读:
    nginx优化——包括https、keepalive等
    Kubernetes+Prometheus+Grafana部署笔记
    常见的页面调度算法
    算法-求二进制数中1的个数
    C++ 关联容器详解——从内部结构到应用
    C++ 容器及选用总结
    C++ STL中迭代器失效的问题
    二维数组和指针
    Linux软连接和硬链接
    what is the virtual machine, when and why we need use it ?
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/10212734.html
Copyright © 2011-2022 走看看