视图: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;

mysql学习之基础篇07的更多相关文章

  1. mysql学习之基础篇01

    大概在一周前看了燕十八老师讲解的mysql数据库视频,也跟着学了一周,我就想把我这一周所学的知识跟大家分享一下:因为是第一次写博客,所以可能会写的很烂,请大家多多包涵.文章中有不对的地方还请大家指出来 ...

  2. mysql学习之基础篇08 UTF8编码

    这次我们来说一下在Mysql中的编码问题: 我们知道应用于计算机的最早的字符集是ASCII,它所组成的编码是ASCII编码:由于对于其他国家来说它所容纳的字符个数比较少,后来就出现了ANSI字符集,它 ...

  3. mysql学习之基础篇05

    mysql中的统计函数: 1. 查询商品价格中最高的价格: select max(shop_price) from goods; 2. 查询商品价格中最低的价格: select min(shop_pr ...

  4. mysql学习之基础篇04

    五种基本子句查询 查询是mysql中最重要的一环,我们今天就来说一下select的五种子句中的where条件查询: 首先我们先建立一张商品表:goods 由于商品数目太多,我就不一一列举了. 在这里我 ...

  5. mysql学习之基础篇03

    我们今天来进行建表的基本操作: 首先要建表就要了解列类型,因为建表就是声明列的过程,列声明完成了,表也就建好了. mysql中列分为三大类: 一.数值型 数值型又分为整型和浮点型两种. 先来看整型: ...

  6. MySQL学习之基础篇09-事务

    我们在建表的时候通常会在最后声明引擎类型,这次我们就来看看存储引擎都有哪些: 举个例子: --------------------------- 银行转账: 张三想给李四转500元钱: 张三-500 ...

  7. mysql学习之基础篇06

    子查询:又分为where型子查询,from型子查询,exists型子查询这三类. where型子查询:指把内层查询的结果作为外层查询的比较条件: 举个例子: 我们想查出goods_id最大的商品,要求 ...

  8. mysql学习之基础篇02

    我们来说一下表的增删改查的基本语法: 首先建立一个简单的薪资表: create table salary(id int primary key auto_increment,sname varchar ...

  9. iOS系列 基础篇 07 Action动作和输出口

    iOS系列 基础篇 07 Action动作和输出口 目录:  1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...

随机推荐

  1. python笔记之按文件名搜索指定路径下的文件

    1.搜索文件名中以指定的字符串开头(如搜索dll,结果中含有dll a,dll abc等) 我的目录下有dll a.txt和dll.txt文件 其中a文件夹下还有这两个文件 我希望通过python选择 ...

  2. Spring cloud微服务安全实战-6-11sentinel之配置持久化

    规则的持久化问题.现在的规则都是在内存里的,我们要写一些代码来编一些规则.启动以后规则在内存里了.如果你配置里面有sentinel的dashboard,有流量经过客户端的时候,它会把规则同步给Dash ...

  3. LayaIDE 报typescript编译版本不一致的错

    LayaIDE 报typescript编译版本不一致的错 文件 -> 首选项->用户设置那里修改下 settings.json // 将设置放入此文件中以覆盖默认设置 { "ty ...

  4. PID:我应该何时计算积分项?

    最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...

  5. IDEA中MyBatis插件的安装及使用

    这个插件的好处就在于能自动关联mapper类与xml,让你可以快速的互相跳转,还能帮助你做简单的排错. 安装方法: 1.File→Settings→Plugins,输入mybatis plugin,本 ...

  6. flex布局大全

    有句话叫做:存在即是合理. 最近很喜欢flex布局模式,不过还在摸索中,这里正一边在项目中使用和总结,也在学习一些大牛们总结的东西和布局思考. 鉴于自己很苦恼,到处去ha资料,真的,就没有一个系统的, ...

  7. [LeetCode] 749. Contain Virus 包含病毒

    A virus is spreading rapidly, and your task is to quarantine the infected area by installing walls. ...

  8. python实践项目三:将列表添加到字典

    1.创建一个字典,其中键是字符串,描述一个物品,值是一个整型值,说明有多少该物品.例如,字典值{'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, ...

  9. LVS的基础使用

    LVS的基础使用 LVS的介绍 A:什么是LVS B:cluster(集群的概念) C:LVS的介绍 LVS的使用 A:ipvsadm命令的使用 ♣一:LVS的介绍 A:什么是lvs LVS的英文全称 ...

  10. PHP提取中英文首字母的方法(首字母索引)

    function Getzimu($str) { $str= iconv("UTF-8","gb2312", $str);//如果程序是gbk的,此行就要注释掉 ...