MySQL-视图
1.概念:
- 视图是 MySQL 在 5.0.1 版本中加入的功能。它可以理解为一个虚表。
-
之所以被称为虚表,是因为它只是存储了一个结构,并不存储真实的数据。它的数据是在查询过程中动态生成的。
-
视图并不是真的优化
2.创建视图:视图 只是存储了一个结构,并不存储真实的数据。
--CRUD select id,user_name,email from `user`; --创建视图 create VIEW user_view as select id,user_name,email from `user`;
3.查看视图:和表一样,我们可以用 desc 视图名;来查看视图的每一列
desc user_view; --查看创建的视图语法 show create view user_view; --查询视图内容 select * from user_view;
>注意:视图查询的数据实则来自与源数据中的内容,而它本质是一个存储了一个结构,并不是存储真实的数据。
>比如:如同PHP中的一个查询方法的封装
4.视图优点:
- 第一个显著优点就是它简化了操作。此时我们完全不用关心视图是怎么处理数据的,我们只需要知道如何使用这个结果集即可,视图相当于一个中间层。
-
第二个显著优点就是它更加安全。比如我们可以让用户有权去访问某个视图,但是不能访问原表,这样就可以起到保护原表中某些数据的作用。
-
我们之后会接触到管理权限,权限是无法细致到某一个列的,通过视图,则很容易实现。
-
第三个显著优点就是降低耦合。假如我们以后要修改原表的结构,那么我们可以通过修改视图的定义即可,而不用修改应用程序,对访问者是不会造成影响的,一般来说,这样代价会更小。
5.视图缺点:
- 表结构修改则需要手动修改视图
- 视图并不能对查询优化,因此在处理大数据的时候,甚至会对性能有些影响。
6.视图IUD:表是可以更新数据的,这里的更新,指的是”增删改”,但是对于视图来说不一定。
update `user` set email = '247301260@qq.com' where id = 1; select * from user_view; --删除视图 DROP VIEW user_view_2;
以下是视图不可更新的情况
- 包含聚合函数、distinct、group by、having、union、union all。
-
常量视图。
-
select 包含子查询。
-
包含连接操作。
-
from 一个不能更新的视图。
-
where 子句的子查询引用了 from 子句中的表。
7.视图应用&好处
- 提高了重用性,就像一个函数
--如果要频繁获取user的name和goods的name。就应该使用以下sql语言。 --示例: 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; --但有了视图就不一样了,创建视图other。 --示例: 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; --创建好视图后,就可以这样获取user的name和goods的name。 --示例: select * from other; --以上sql语句,就能获取user的name和goods的name了。
- 对数据库重构,却不影响程序的运行
--假如因为某种需求,需要将user拆房表usera和表userb,该两张表的结构如下 --测试表:usera有id,name,age字段 --测试表:userb有id,name,sex字段 --这时如果php端使用sql语句: select * from user; --那就会提示该表不存在,这时该如何解决呢。 --解决方案:创建视图。 --以下sql语句创建视图: create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name; --以上假设name都是唯一的。 --此时php端使用sql语句: select * from user; --就不会报错什么的。这就实现了更改数据库结构,不更改脚本程序的功能了。
- 提高了安全性能。可以对不同的用户
--设定不同的视图。例如:某用户只能获取user表的name和age数据,不能获取sex数据。则可以这样创建视图。 --示例 如下: create view other as select a.name, a.age from user as a; --这样的话,使用sql语句: select * from other; --最多就只能获取name和age的数据,其他的数据就获取不了了。
-
让数据更加清晰想要什么样的数据,就创建什么样的视图。经过以上三条作用的解析,这条作用应该很容易理解了。