视图
1.1 概念
1. 视图是 MySQL 在 5.0.1 版本中加入的功能。它可以理解为一个虚表。
2. 之所以被称为虚表,是因为它只是存储了一个结构,并不存储真实的数据。它的数据是在查询过程中动态生成的。
3. 视图并不是真的优化
1.2 创建视图
视图 只是存储了一个结构,并不存储真实的数据。
-- 创建视图
create VIEW user_view as select id,user_name,email from `user`;
1.3 查看视图
和表一样,我们可以用 desc 视图名;来查看视图的每一列
desc user_view;
-- 查看创建的视图语法
show create view user_view;
-- 查询视图内容
select * from user_view;
1.4 视图优点
1. 第一个显著优点就是它简化了操作。此时我们完全不用关心视图是怎么处理数据的,我们只需要知道如何使用这个结果集即可,视图相当于一个中间层。
2.第二个显著优点就是它更加安全。比如我们可以让用户有权去访问某个视图,但是不能访问原表,这样就可以起到保护原表中某些数据的作用。
2. 我们之后会接触到管理权限,权限是无法细致到某一个列的,通过视图,则很容易实现。
3. 第三个显著优点就是降低耦合。假如我们以后要修改原表的结构,那么我们可以通过修改视图的定义即可,而不用修改应用程序,对访问者是不会造成影响的,一般来说,这样代价会更小。
1.5 视图缺点
1. 表结构修改则需要手动修改视图
1.6 视图IUD
表是可以更新数据的,这里的更新,指的是”增删改”,但是对于视图来说 不一定。
update `user` set email = 00 where id = 12;
select * from user_view;
-- 删除视图
DROP VIEW user_view_2;
以下是视图不可更新的情况
1. 包含聚合函数、distinct、group by、having、union、union all。
2. 常量视图。
3. select 包含子查询。
4. 包含连接操作。
5. from 一个不能更新的视图。
6. where 子句的子查询引用了 from 子句中的表。
创建一个新的视图
create view user_view_2 as select id,user_name,password,email,status from `user` where status = 0;
select * from user_view_2;
现在如果给这个视图新增数据 status = 1;
insert into user_view_2(id, user_name, password, email, status) values (30, '221', '12', '12', 1);
select * from user_view_2;
select * from `user`;
你会发现我们可以向该视图插入数据,它不满足本视图的要求,但是数据可以插入基表了
with check option
- 对于上面的表 t2,我们想:是否可以创建一个视图,它只允许修改满足本视图要求的数据,而对于不满足本视图要求的数据操作, 统统拒绝呢?
- 答案是肯定的。那就需要 with check option 了,不过该修饰符还有更加深一步的权限机制。
- 首先我们还是利用上一步的 t2,我们创建一个视图 v3,它的创建
DROP VIEW user_view_2; create view user_view_2 as select id,user_name,password,email,status from
userwhere status = 0 with check option; insert into user_view_2(id, user_name, password, email, status) values (31, '221', '12', '12', 1);
错误信息
[Err] 1369 - CHECK OPTION failed ‘community.user_view_2’
这里可以理解为 with check option 的作用就是多了一个 check 的功能,即检查的功能,也就是说插入的数据必须满足该视图的条件,才允许被操作。