MySQL(十)之视图
前言
前面给大家介绍了查询语句,感觉写的还不错的,喜欢的可以去查看。今天给大家分享的是MySQL中的视图。
视图(View):视图是由查询结果形成一张虚拟的表。非临时表,只要不删除的话就会一直存放在磁盘上,但是没有对应的文件。视图的使用和正常的表的使用一样。
一、什么是视图
视图是数据库数据的特定子集。可以禁止所有用户访问数据库表,而要求用户只能通过视图操作数据,这种方法可以保护用户和应用程序不受某些数据库修改的影响。
视图是抽象的,他在使用时,从表里提取出数据,形成虚的表。不过对他的操作有很多的限制。
视图是永远不会自己消失的除非手动删除它。
视图有时会对提高效率有帮助。临时表几乎是不会对性能有帮助,是资源消耗者。
视图一般随该数据库存放在一起,临时表永远都是在tempdb里的。
视图适合于多表连接浏览时使用;不适合增、删、改,这样可以提高执行效率。
二、视图概述
2.1、视图和表的区别
视图是已经编译好的sql语句,而表不是。
视图没有实际的物理记录,而表有。
表是内容,视图是窗口。
表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改。
视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
视图的建立和删除只影响视图本身,不影响对应的基本表。
2.1、视图和表的联系
视图是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。
一个视图可以对应一个基本表,也可以对应多个基本表。
视图是基本表的抽象和在逻辑意义上建立的新关系。
2.3、视图的类型
因为不同的数据库,例如:Mysql、Sql Server、Oracle及DB2等,他们不论在视图的创建和类型上都有不同,特别是在类型上区别较大,所以这里我们以Mysql来说明总结,至于其它数据的特点会在日后继续更新。
create [algorithm=算法] view v_name as select 语句
algorithm = merge/temptable/undifined(前两种任选)
在Mysql中视图的类型分为:
1)MERGE
将视图的sql语句和引用视图的sql语句合并在一起,最后一起执行。
当引用视图时,引用视图的语句与定义视图的语句合并。
2)TEMPTABLE
将视图的结果集存放在临时表中,每次执行时从临时表中操作。
当引用视图时,根据视图的创建语句建立一个临时表。
3)UNDEFINED
当引用视图时,根据视图的创建语句建立一个临时表。
默认的视图类型,DBMS倾向于选择而不是必定选择MERGE,因为MERGE的效率更高,更重要的是临时表视图不能更新。
所以,这里推荐使用MERGE算法类型视图。
三、视图的基本使用
环境:
create view v_name as select 语句;
创建完一个视图,可以通过查看数据库中的全部数据表来查看:
可以看到当前数据库中已经把刚刚创建的视图放进数据库的表集合中了。因为视图也是一种表,是虚拟表。
3.2、查询
视图的查询和基本表的查询一样,因为视图也是一种数据表,所以你可以像这样的来查询它
3.3、删除视图
drop view v_name;
删除视图,对基本表没有任何的影响
3.4、修改视图
alter view v_name as select 语句;
结果检查:
3.5、更新视图
1)创建新视图
2)更新视图
总结:更新会导致基本表中的数据也会相应的更新
四、使用视图的优点
4.1、可以简化查询
查询平均工资前三高的部门:
4.2、可以进行权限控制
把表的权限封闭,但是开放相应的视图查看权限,视图中只开放部分数据。
4.3、大数据分表时可以用到
比如 一般情况下(无特殊优化)表的行数超过200w时,操作就会明显变慢,可以把一张表的数据,拆分成多张表来存放。
利用视图,把多张表形成一张视图,看起来像是一整张表。
4.4、便于数据库的维护整理
A、B表合成C表,要想让原来的SQL不变,可以通过C表,把A、B表结构相同数据相同的视图创建出来继续使用。