zoukankan      html  css  js  c++  java
  • mysql学习之基础篇07

    视图:view

    在查询的时候我们经常把查询到的结果当成一张临时表来看,其实view就可以看成一张虚拟表,是表通过某种运算得到的投影

    那么如何创建视图?创建视图需要指定视图的列名和列类型吗?

    答:不用,它只是一种关系

    既然视图只是表的某种查询得到的投影,所以主要步骤在于查询表上,查询到的结果命名为视图就行了。

    创建视图的语法很简单:

    Create view 视图名

    As

    Select 语句

    举个栗子:我们想查询每个栏目下面商品的平均价格,然后取出平均价格前3高的栏目,应该怎么做?

    select cat_id,avg(shop_price)
    from goods
    group by cat_id
    order by avg(shop_price) desc
    limit 3;

    那我们又想查询每个栏目下面商品的平均价格,然后取出平均价格前3低的栏目,又该怎么做?

    其实跟上面的差不多,只不过把排序方式从降序更改为升序:

    select cat_id,avg(shop_price)
    from goods
    group by cat_id
    order by avg(shop_price) asc
    limit 3;

    那我们还想查询平均价格在第三到第五之间的栏目,又该怎么做?

    select cat_id,avg(shop_price)
    from goods
    group by cat_id
    order by avg(shop_price) desc
    limit 2,5;

    其实我们可以发现,在上面的那些查询中,我们都要用到“每个栏目下的平均价格”,这时候就该我们的视图出场了:

    我们把“每个栏目下的平均价格”创建成一个视图:

    create view result
    as
    select cat_id,avg(shop_price) as pj from goods group by cat_id;

    接下来我们就可以直接对视图进行操作了:

    我们来查询平均价格在20到100的栏目:

    select * from result where pj between 20 and 100;

    那我们来对goods表进行操作看看视图会不会发生变化:

    insert into goods
    (goods_id,goods_name,cat_id,shop_price)
    values
    (33,'金立930浪漫镶钻手机',4,1999);

     我们来看看result视图发生变化了没:

    select * from result;

     

    我们可以看到第4栏目的平均价格减少了

    这说明我们对表进行操作会影响由这张表生成的视图。

    那我们再看看对视图的操作是否能影响表:

    我们修改第四栏目的平均价格试试:

    update result set pj=2100 where cat_id=4;

    我们可以看到报出了这样一个错误,告诉我们result表不能被修改。

    其实从逻辑上也很好理解,我们这个价格是平均价格,修改它的话到底该怎么反馈到goods表?这就产生歧义了,所以我们不能修改它,,增加,删除也是一样的。

    那么视图就真的不能被增删改吗?

    答:不是,只有它和原表中的字段一一对应,就像数学中的映射那样,我们才能对它进行操作:

    举个栗子:先建立一张w表:

    create table w(
    id int,
    name varchar(20)
    )engine myisam charset utf8;

    然后插入数据:

    insert into w
    values
    (001,'aaa'),(002,'bbb'),(003,'ccc');

    我们可以看到里面有三条数据;

    然后我们根据w表生成一张视图叫w1:

    create view w1
    as
    select * from w;

    然后我们对视图w1增加数据:

    insert into w1
    values
    (004,'dddd');

    我们可以看到程序没有报错,然后我们看看这张视图:

    我们发现,里面确实被增加了一条数据;

    那我们再看看w表发生了什么变化:

    可以看到w表也被增加了一条数据;

    然后我们修改视图中的数据:

    update w1 set name='eeee' where id=1;

    我们可以看到,视图中的数据被修改了,那看看w表情况如何:

    可以看到w表中的数据也被修改了。

    删除我就不给大家演示了,也是同样的效果。

    这就证明我们是可以通过修改视图来修改表的,前提是我们的字段要一一对应,不能在逻辑上出现歧义。

    对于一些简单的视图,它在发挥作用的过程中,并没有建立临时表,而只是把条件存起来,下次来查询,把条件一合并,直接去查表。相比于建立临时表,合并查询语句更加快捷。

    那么到底是建立临时表还是保存条件?这就需要用到algorithm 来明确指定了:

    Algorithm= merge  合并查询语句

    Algorithm=temptable 建立临时表

    Algorithm= undefined 未定义,由系统判断。

     这么说可能不好理解,我们还是通过一个例子来给大家演示:

    我们根据上面的w表生成一张视图,不过我们指定它的类型是合并查询语句:

    create Algorithm=merge view w2
    as 
    select * from w where id>2;

    然后我们在这张视图中进行查询:

    select * from w2 where id<4;

    它并没有在内存中生成一张叫w2的临时表,而是把我们的查询条件保存了起来

    我们查询到的结果其实相当于就是把两次查询条件合并到一起,跟下面的语句效果是等价的;

    select * from w where id<4 and id>2;

  • 相关阅读:
    ActiveMQ消息队列技术融合Spring
    ActiveMQ消息队列技术Demo
    网页静态化技术Freemaker
    Solr的基本语法
    Solr的页面展示以及高亮显示
    Solr的了解与配置
    Angular中上传图片到分布式文件服务器FastDFS上
    分布式文件服务器FastDFS的使用
    自我学习笔记01
    数组转换成List集合
  • 原文地址:https://www.cnblogs.com/wanghaoyu666/p/11287265.html
Copyright © 2011-2022 走看看