热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

快速入门:使用ecshop的goods表,查询平均价格前三高的栏目
快速入门:使用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;

编号

产品名称

市场价

成本价

单位

品牌

1

黄金

446

200

元/克

周大福

2

铂金

375.94

192

元/克

周大福

3

金条

456.87

185.35

元/克

周大生

4

饰品

461

203.58

元/克

周大生

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

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

#创建珠宝表
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的视图 ,这样程序只需要稍微改下,原来的查询等语句照样使用。

#p#深入理解视图#e#

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

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

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

使用视图可以节省空间。

2. 视图是如何工作的?

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

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

编号

名称

价格

操作系统

品牌

1

iphone5

5999

ios

Apple

2

iphone4s

4430

ios

Apple

3

htc 328w

2930

android

HTC

4

htc G21

2250

android

HTC

5

htc one s

2500

android

HTC

6

lumia 920

4590

wp8

Nokia

7

lumia 800

2900

wp7

Nokia

8

nokia N9 

2300

MeeGo

Nokia

9

Galaxy 3

3480

android

samsung


#创建phone表


reate 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 goodsorder 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;


推荐阅读
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
author-avatar
傻a2602909381
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有