教程-视图的概念和基本用法

  快速入门:使用ecshop 的goods表,查询平均价格前三高的栏目。

  传统方式:

  select cat_id,avg(shop_price) as aprice from goods

  group by cat_id

  order by aprice desc limit 3;

  新的方式:利用创建视图

  #创建视图:

  create view v1 as

  select cat_id,avg(shop_price) as aprice from goods;

  #查看视图:

  Show tables;

  #查看视图列:

  Desc 视图名

  #查看视图创建:

  Show create view 视图名

  #删除视图:

  Drop view 视图名

  视图的好处:

  1. 简化查询。

  2. 权限控制。

  3. 分表查询.

  4. 可维护性好。、

  A .简化查询,上面的例子用视图实现的代码:

  创建视图表

  Create view v1 as

  Select gooods_id,cat_id,goods_name,avg(shop_price) as aprice from esc_goods group by cat_id;

  #查询视图表

  Select *from v1 order by aprice limit 3;

  B 权限控制,假设有如下表,由小刘来维护,需要他进行开发和管理销售软件,但又不能让其看到成本价,该怎么做?

  编号产品名称市场价成本价单位品牌

  1黄金446200元/克周大福

  2铂金375.94192元/克周大福

  3金条456.87185.35元/克周大生

  4饰品461203.58元/克周大生

  #演示如何通过视图来控制权限

  #创建珠宝表

  create table jewelry(

  id int unsigned not null auto_increment primary key,

  name varchar(20) not null,

  price decimal(10,2) not null,

  cost decimal(10,2) not null,

  unit varchar(20) not null,

  brand varchar(30) not null

  );

  #插入几条记录

  insert into jewelry(name,price,cost,unit,brand) values('黄金',446,200,'元/克','周大福');

  insert into jewelry(name,price,cost,unit,brand) values('铂金',375.94,192,'元/克','周大福');

  insert into jewelry(name,price,cost,unit,brand) values('金条',456.87,185.35,'元/克','周大生');

  insert into jewelry(name,price,cost,unit,brand) values('饰品',461,203.58,'元/克','周大生');

  #创建一个视图

  #新建用户,登录MySQL

  mysql> insert into user(host,user,password,ssl_cipher,x509_issuer,x509_subject) values('localhost'

  test',password('123'),'','','');

  #刷新系统权限表

  mysql> flush privileges;

  #为用户授权,要使用root账户,针对某个视图创建权限(数据库名.视图名)

  grant select,insert,update,delete on wcp.vj to test@localhost;

  #删除用户

  C 分表查询,加快查询速度。假设现在有一个海量数据表,比如QQ账户表,用户反映登录时间太长,有没有办法将其优化一下?

  分表:

  可以按qq号码取余的方式将qq用户表分成10张表,

  Qq1,qq2,qq3,qq4,qq5,

  如何查询?

  10003 %10 = 3

  Create view vq as

  Slect * from qq1 union select * from qq2

  D 维护性好,小明在公司做网站开发和维护工作,因为业务的变化,数据库中有两张表a和b,现在需要组合成c表,你能帮他出出主意吗?

  A表

  B表

  C表

  可以利用视图,先把表A和表B联合成一张表C,然后从c表分别创建原来 表A的视图和表B的视图 ,这样程序只需要稍微改下,原来的查询等语句照样使用。

  深入理解视图-视图的算法及其与表的关系

  1. 视图和表是什么关系?

  视图是一张虚拟的表,并不是物理上存在的,只不过我们可以将其作为表来使用。

  使用视图可以节省空间。

  2. 视图是如何工作的?

  在使用视图的时候,引用对应的表,查询得到这个结果。

  3. 视图和表之间的操作会影响对方吗?

  编号名称价格操作系统品牌

  1iphone55999iosApple

  2iphone4s4430iosApple

  3htc 328w2930androidHTC

  4htc G212250androidHTC

  5htc one s2500androidHTC

  6lumia 9204590wp8Nokia

  7lumia 8002900wp7Nokia

  8nokia N9 2300MeeGoNokia

  9Galaxy 33480androidsamsung

  #创建phone表

  create table phone(

  id int unsigned not null auto_increment primary key,

  name varchar(30) not null,

  price decimal(7,2) not null,

  os varchar(30) not null,

  brand varchar(30) not null

  );

  #插入八条记录

  insert into phone(name,price,os,brand) values('iphone5',5999,'ios','Apple');

  insert into phone(name,price,os,brand) values('iphone4s',4430,'ios','Apple');

  insert into phone(name,price,os,brand) values('htc328w',2930,'android','HTC');

  insert into phone(name,price,os,brand) values('htc G21',2250,'android','HTC');

  insert into phone(name,price,os,brand) values('htc one s',2500,'android','HTC');

  insert into phone(name,price,os,brand) values('lumia920',4590,'wp8','Nokia');

  insert into phone(name,price,os,brand) values('lumia800',2900,'wp7','Nokia');

  insert into phone(name,price,os,brand) values('nokia n9',2300,'meego','Nokia');

  #创建一个视图vphone1

  mysql> create view vp1 as select name,price,brand from phone;

  #对表更新,看其对视图的影响

  结论:表的更新会直接影响到视图。

  #查看视图

  #对视图更新,看其对表的影响

  update vp1 set price = price - 500;

  结论:改变视图是可以改变表的。但是不是总是能改变,只有在视图和原表一一对应的情况下才能通过视图改变表。

  #再创建一个视图,vphone2

  mysql> create view vp2 as

  -> select brand,avg(price) as aprice from phone

  -> group by brand;

  #查看视图

  #更新视图vphone2

  mysql> update vp2 set aprice = aprice + 500;

  ERROR 1288 (HY000): The target table vp2 of the UPDATE is not updatable

  结论:但是不是总是能改变,只有在视图和原表一一对应的情况下才能通过视图改变表。

  #向视图vphone1中插入记录,

  mysql> insert into vp1 values('galaxy '3470','samsung','android');

  ERROR 1423 (HY000): Field of view 'wcp.vp1' underlying table doesn't have a default value

  对于在视图中没有出现的列,而在表中有没有默认值,则此时插入会失败。

  #更改表结构

  mysql> alter table phone modify os varchar(30) not null default '';

  #再向视图vphone1中插入记录

  mysql> insert into vp1 values('galaxy '3470','samsung','android');

  4. 视图使用注意事项

  a. 视图也是一种表,是虚拟表,或者说表和视图共享数据库中相同的名称空间,不能与已有的表(视图)出现重名。

  b. 视图属于数据库。在默认情况下,将在当前数据库创建新视图。

  视图的算法

  1. 使用视图来实现查询每个栏目下最贵的商品,该怎么做?

  原先做法:

  mysql> select goods_id,goods_name,cat_id,shop_price from (

  -> select goods_id,goods_name,cat_id,shop_price from goods

  -> order by cat_id,shop_price desc) as temp

  -> group by cat_id;

  使用视图来实现:

  mysql> create view vec as

  -> select goods_id,goods_name,cat_id,shop_price from goods

  -> order by cat_id,shop_price desc;

  mysql> select * from vec group by cat_id;

  结果不对,why?

  把创建视图和查询视图的语句合并到一起。

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

  这样又回到我们错误的老路上。

  原因,就是因为使用的是merge算法,

  视图的三种算法(algorithm)

  模式说明备注

  merge合并,在执行视图的时候,将查询视图语句和创建视图语句合并到一起,然后执行。默认

  temptable临时表,在执行查询视图语句时,首先执行创建视图语句,并将其作为一个临时表,接着让查询视图的语句查询。

  undefined未定义,自动选择,

  改变视图的算法:

  Create algorithm = temptable view 视图名 as

  mysql> create algorithm=temptable view vec as

  -> select goods_id,goods_name,cat_id,shop_price from goods

  -> order by cat_id,shop_price desc;

时间: 2024-11-09 01:38:46

教程-视图的概念和基本用法的相关文章

Redux 入门教程(一):基本用法

一年半前,我写了<React 入门实例教程>,介绍了 React 的基本用法. 但是,React 只是 DOM 的一个抽象层,并不是 Web 应用的完整解决方案.也就是说,只用 React 没法写大型应用. 为了解决这个问题,2014年 Facebook 提出了 Flux 架构的概念,引发了很多的实现.2015年,Redux 出现,将 Flux 与函数式编程结合一起,很短时间内就成为了最热门的前端架构. 本文详细介绍 Redux 架构,由于内容较多,全文分成三个部分.今天是第一部分,介绍基本概

入门教程:CSS基本语法及用法入门

css|教程|入门教程|语法 1.基本语法 CSS的定义是由三个部分构成:选择符(selector),属性(properties)和属性的取值(value). 基本格式如下: selector { property: value} (选择符 { 属性:值}) 选择符是可以是多种形式,一般是你要定义样式的HTML标记,例如BODY.P.TABLE--,你可以通过此方法定义它的属性和值,属性和值要用冒号隔开: body { color: black} 选择符body是指页面主体部分,color是控制

视图的概念

概念|视图        视图是原始数据库数据的一种变换,是查看表中数据的另外一种 方式.可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的 数据.     视图是从一个或多个实际表中获得的,这些表的数据存放在数据 库中.那些用于产生视图的表叫做该视图的基表.一个视图也可以从 另一个视图中产生.     视图的定义存在数据库中,与此定义相关的数据并没有再存一份 于数据库中.通过视图看到的数据存放在基表中.     视图看上去非常象数据库的物理表,对它的操作同任何其它的表 一样.当通过视图修改

Oracle数据库-视图的概念

oracle|概念|视图|数据|数据库     视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式.可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据.     视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中.那些用于产生视图的表叫做该视图的基表.一个视图也可以从另一个视图中产生.     视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中.通过视图看到的数据存放在基表中.     视图看上去非常象数据库的物理表,对它的操作同任何其它的表一样.当通

Photoshop合成教程:数字概念的人脸

本教程讲述如何用Photoshop把一个黑白图片通过素材的叠加和其它方法合成一个未来数字概念的人脸,先看效果图. 首先打开一幅男人脸部图片. 建新层,画一眼球大小的正圆选区,浅蓝到深蓝径向渐变. 添加蒙版,用黑色笔刷去除多余部分,图层模式叠加.

汇编教程之基本概念(win32)

我们先假设您已知道了如何使用MASM.如果您还不知道的话,请下载 win32asm.exe ,并请仔细研读其中所附带的文档资料.好,如果您已准备就绪,我们这就开始吧! 理论: WIN32 程序运行在保护模式下的,保护模式的历史可以追溯到 80286.而今 80286 已成为了历史.所以我们将只把精力集中于 80386 及后续的X86 系列 CPU.Windows 把每一个 Win32 应用程序放到分开的虚拟地址空间中去运行,也就是说每一个应用程序都拥有其相互独立的 4GB 地址空间,当然这倒不是

iOS编程(双语版) - 视图 - 基本概念

1. 什么是视图? 视图显示为手机上的一块矩形区域,管理该区域的所有屏幕显示,它是UIView或者UIView的子类. 视图既可以从xib生成,也可以用代码生成.   2. 窗口 窗口是UIWindow或者它的子类. 视图结构的顶层便是app的窗口. 窗口必须充满设备的屏幕,因此,必须设置窗口的frame为屏幕的bounds. (稍后我会讲解frame和bounds的区别) 代码如下: Objective-C UIWindow* w = [[UIWindow alloc] initWithFra

CSS教程:li和ul标签用法举例

LI代码的格式化: A).运用CSS格式化列表符: ul li{ list-style-type:none; } B).如果你想将列表符换成图像,则: ul li{ list-style-type:none; list-style-image: url(/blog/images/icon.gif); } C).为了左对齐,可以用如下代码: ul{ list-style-type:none; margin:0px; } D).如果想给列表加背景色,可以用如下代码: ul{ list-style-t

Yii视图CGridView列表用法实例分析_php实例

本文实例讲述了Yii视图CGridView列表用法.分享给大家供大家参考,具体如下: CGridView列表实例 <!-- 列表 --> <?php $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'words-grid', 'dataProvider'=>$model->search(),//数据源 'filter'=>$model,//设置过滤器,筛选输入框 'columns'=>a