1.视图是指从一个或多个表中取出我们需要的字段,组成一个类似于表的对象
(1)视图的实质:是一个虚拟表(非真实存在)
<1>本质是:根据SQL语句获取动态的数据集,并为其命名
<2>也是一条SQL语句,查询的是普通表中的数据集合,将这个数据集封装重新命名作为表使用(起了个别名)
<3>实际上这个表是不存在的:下次直接使用别名,而不用再去写这条SQL语句了
(2)通俗理解就是将一张表中经常要查询的列和记录创建成一张虚拟的表
<1>一般情况下,需要创建成虚拟表的都是一些临时表
<2>临时表分为:外部临时表/内部临时表
1.外部临时表:
1.1.通过create temporary table语法创建的临时表,可以指定存储引擎为memory,innodb, myisam等等
1.2.这类表在会话结束后,会被自动清理
1.3.show tables命令不显示临时表信息
2.内部临时表:
2.1.通常在执行复杂SQL,比如group by, order by, distinct, union,form(子查询)等等
2.2.执行计划中如果包含Using temporary,那么MySQL内部将使用自动生成的临时表,以辅助SQL的执行
<3> 视图虚拟表的创建所用到的临时表主要是内部临时表
(3)使用视图可以把查询过程中的临时表摘出来,用视图去实现
<1>以后再操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,极大方便了查询过程
<2>视图中看到的数据会随着原始表的更新而动态更新
<3>定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图
<4>视图是存储在数据库中的SQL查询语句,它主要出于原因有: 安全原因,视图可以隐藏一些数据
(4)在MySQL中视图功能就比较类似于Exel中的筛选功能
(5)视图的优点:
<1>简单——用户不需要关系视图中的数据如何查询获得,视图中的数据已经是过滤好的符合条件的结果集;
<2>安全——用户只看到视图中的数据
<3>数据独立——视图结构一旦确定,可以屏蔽表结构对用户的影响
(6)视图缺点:
<1>不能在视图上创建索引
<2>在视图的FROM子句中不能使用子查询
<3>视图封装的SQL语句结果集主要是查询语句
<4>视图有明显地效率问题,并且视图是存放在数据库中的
<5>如果程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用
2.视图的基本使用
(1)创建视图:
<1>create view 视图名称 as SQL查询;
<2>create view 视图名称(字段名列表) as SQL查询;
注意:1.在视图表中不定义字段名的话,默认使用基表的字段名,
2.若定义字段名的话,视图表中的字段必须和基表的字段个数相等
<3>示例:创建一个名为view_user的视图,功能为查询mysql库中的user表中的user,host,password 字段信息
CREATE VIEW view_user AS SELECT user,host,password FROM mysql.user
<4>上述示例为单表视图 , 视图也可以创建多表视图 (多表联查)
(2)查看视图:
<1>查看当前库下所有的表的状态信息:show table status;
<2>查看创建视图具体命令:show create view 视图名;
(3)使用视图:
<1>对视图操作即为基本操作,反之亦然,修改视图,原始表也跟着改
<2>查询记录:select 字段名列表 from 视图名 where 条件;
<3>插入记录:insert into 视图名(字段名列表) values(字段名列表);
<4>更新记录:update 视图名 set 字段名=值 where 条件;
<5>删除记录:delete from 视图名 where 条件;
注意:1.不应该修改视图中的记录,而且是在涉及多个表的时候,根本无法修改视图记录
2.视图主要用来作查询SQL的封装
3.插入,更新,删除操作,不建议使用视图操作,因为多表时是不成功的
(4)删除视图:DROP VIEW 视图名称
(5)修改视图:ALTER VIEW 视图名称 AS SQL语句
3.视图的应用实例
(1)mysql视图的创建与使用
<1>作用:提高了重用性,就像一个函数
<2>示例:先创建3张表
1.user表(id,name,age,sex)(1,张三,16,男)
2.goods表(id,name,price)(1,香蕉,3)
3.ug表(id,userid,goodsid)(1,1,1):比如某某人有哪些食物
<3>目的:查询某人有某食物
1.create view 视图名称 as 普通的查询语句;
实例:create view other as
select a.name as username, b.name as goodsname
from user as a, goods as b, ug as c
where a.id=c.userid and c.goodsid=b.id;
2.查询视图:
select * from other;//查询结果(张三,香蕉)
(2)对数据库重构,却不影响程序的运行
<1>假如因为某种需求,需要将user拆房表usera和表userb,该两张表的结构如下:
1.测试表:usera有id,name,age字段
2.测试表:userb有id,name,sex字段
<2>这时如果使用sql语句:select * from user;那就会提示user表不存在
<3>解决方案:创建视图
1.以下sql语句创建视图:
create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name;
<4>此时使用sql语句:select * from user;就不会报错
1.这就实现了更改数据库结构,不更改脚本程序的功能了
(3)提高了安全性能,权限设置
<1>可以对不同的用户,设定不同的视图
<2>某用户只能获取user表的name和age数据,不能获取sex数据
<3>则可以这样创建视图,示例如下:
create view other as select a.name, a.age from user as a;
<4>使用sql语句:select * from other; 最多就只能获取name和age的数据,其他的数据就获取不了了。