zoukankan      html  css  js  c++  java
  • 怎么创建一个视图?

    三张表连接·· A表的a字段 对应 B表的b字段  ,B表的b1字段对应C 表的c字段
    现在 建立 一个视图,可以同时 看到三张表的 所有信息·~

    那位高手 帮帮我啊·~~~
    create or replace view v_name
    as
    select t1.*,t2.*,t3.*
    from A表 t1, B表 t2, C表 t3
    where t1.a=t2.b and t2.b1=t3.c

     1.什么是视图?

    视图是由查询结果形成的一张虚拟表。

    2.什么时候要用到视图?

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

    3.视图的创建语法:

    create view 视图名 as select 语句;

    4.使用视图有什么好处呢?

    ①简化查询语句

    比如:有一张商品表,我们经常要查每个栏目下商品的平均价格

    select cat_id,avg(shop_price) from goods gropy by cat_id;

     这时候我们就可以创建一张视图:

    create view avgPrice as select cat_id,avg(shop_price) from goods gropy by cat_id;

    创建完,以后我们要查每个栏目的平均价格时,只要这么写

    select * from avgPrice;就可以了。

    ②可以进行权限控制

    把表的权限封闭,但是开放相应的视图权限,视图里只开放部分数据列

    比如我们的goods商品表,我们不想让别人看到我们的销售价格,这时候我们就可以把查看商品表的权限封闭,创建一张视图

    create view showGoods as select goods_id,goods_name from goods;

    不出现销售价格列就可以了。

    ③大数据分表时可以用到

    比如表的行数据超过200万行时,速度就会变慢

    可以把一张表的数据拆成4张表来存放

    News表

    newsid  1,2,3,4...

    news1,news2,news3,news4表

    把一张表的数据分散到4张表里,分散的方法有很多,

    最常用的是id取模来计算 

    id%4+1=[1,2,3,4]

    ...

    还可以用视图,把四张表形成一张视图

    create view news as select * from news1 union select * from news2 union ...

    5.视图的修改

    alter view 视图名 as select 语句;

    6.视图与表的关系

    视图是表的查询结果,自然表的数据变了,会影响视图的结果

    7.那么视图改变了会影响到表吗?

    ①视图的增删改也会影响表;

    ②但视图并不总是能增删改的;

    视图的数据与表的数据一一对应时可以修改;

    对于视图的insert还应注意:视图必须包含表中没有默认值的列。

    8.视图的algorithm(运算规则)

    algorithm = merge/temptable/undefined

    merge:当引用视图时,引用视图的语句与定义视图的语句合并

    意味着视图只是一个规则,语句规则,当查询视图时,把查询视图的语句

    比如:where...那些与创建时的语句where子句等合并,分析,形成一条select语句。

    举个列子:

    我们先创建一张视图查询所有商品价格大于3000的商品

    create view g2 as select goods_id,goods_name,shop_price from goods where shop_price > 3000;

    然后我们再查询视图的时候,再加上一个where条件<5000

    select * from g2 where shop_price < 5000

    这时候它就会把两条语句合并分析最终形成这样一条select语句

    select goods_id,goods_name,shop_price from goods where shop_price > 3000 and shop_price < 5000;

    temptable:是根据创建语句瞬间创建一张临时表,然后查询视图的语句从该临时表查数据

    merge 和 temptalbe 有一个显著的区别:

    merge最终去查的还是goods表,而temptable去查的是虚拟表。

    举个例子:我们要得到每个栏目下最贵的商品

    首先我们创建一张视图查出每个栏目的商品按价格降序排序

    create view lmj as select cat_id,goods_id,goods_name,shop_price from goods order by cat_id,shop_price desc;

    这时候我们在查询这张视图的时候再对cat_id进行分组是不是就能得到我们想要的结果呢?

    select * from lmj group by cat_id;

    答案是不能的,因为它把我们的创建视图的语句和查询视图的语句合并成

    select cat_id,goods_id,goods_name,shop_price from goods group by cat_id order by cat_id,shop_price desc;

    而如果我们在创建视图的时候指定了它的运算规则为:temptable

    create algorithm=temptable view lmj as select cat_id,goods_id,goods_name,shop_price from goods order by cat_id,shop_price desc;

    然后我们再查询视图:select * frm lmj group by cat_id;就能得到我们想要的结果了。

    它会先把select cat_id,goods_id,goods_name,shop_price from goods order by cat_id,shop_price desc;这句sql语句取到的结果放到一张临时表,然后我们再从这张临时表查自然能得到我们想要的结果了,而不是合并了再去查。

    undefined:未定义,自动,让系统帮你选。

    大家要自己动手做个例子才能更快理解它们的区别。

  • 相关阅读:
    LoaRunner性能测试系统学习教程:场景设计实践之IP欺骗技术(2)
    LoaRunner性能测试系统学习教程:场景设计实践之集合点(1)
    LoadRunner性能测试系统学习教程:脚本编写之异步函数(9)
    LoadRunner性能测试系统学习教程:脚本编写之异步技术(8)
    LoadRunner性能测试系统学习教程:脚本编写之关联函数介绍(7)
    LoadRunner性能测试系统学习教程:脚本编写之关联技术(6)
    川石学员:毕业一年,月入过万,这你能想象?
    LoadRunner性能测试系统学习教程:脚本编写之关联技术(5)
    完整语法的增删改查
    表的详细操作、表关系
  • 原文地址:https://www.cnblogs.com/jiangxiaobo/p/5763836.html
Copyright © 2011-2022 走看看