创建使用视图
知识要点
创建视图
使用WITH CHECK OPTION约束
定义视图时的其它选项
视图查询语句的处理
创建视图
1.语法:
CREATE [OR REPLACE] VIEW view_name [(column_list)]
AS select语句 ##可以相当复杂
[WITH [CASCADED | LOCAL] CHECK OPTION]
OR REPLACE:如果视图已经存在则替换它
2.视图是一个逻辑表,它本身并不包含数据。通过它,可以展现基表的部分数据。用来创建视图的表叫做基表BASE TABLE。视图是作为一个SELECT语句保存在数据字典中的
示例:
create view v_student as
select id,name from student; ##创建视图,相当于给select id,name from student语句起别名为v_student
注:访问v_student视图时,结果和select id,name from student语句的结果相同
3.视图一旦创建完毕,就可以像一个普通表那样使用。视图主要用来查询
查看视图cplayers的结构:可见,如果创建视图时不明确指定视图的列名,那么它的列名就和定义视图的select子句中的列名完全相同
示例: desc v_student;
4.创建视图时,可以显式的指定视图的列名
示例:
create view v_stu(stu_id,stu_name) ##创建视图并为id列和name列起别名为stu_id和stu_name
as select id,name from student; 注:该语法要求视图名后面的列的数量必须匹配select子句中的列的数量
5.视图删除数据
因为视图本身没有数据,因此对视图进行的dml操作最终都体现在基表中。
(1)可以删除视图中有的数据
(2)也可以删除视图中没有的数据,可以在定义试图时带上WITH CHECK OPTION约束,这样就只能删除或者修改视图中有的数据
通过视图修改表(视图的DML操作)
1.不是所有的视图都可以做DML操作。有下列内容之一,视图不能做DML操作
1)select子句中包含distinct
2)select子句中包含组函数
3)select语句中包含group by子句
4)select语句中包含order by子句
5)select语句中包含union 、union all等集合运算符
6)where子句中包含相关子查询
7)from子句中包含多个表
此外,对于update,还有:
8)如果视图中有计算列,则不能更新
此外,对于insert,还有:
9)如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作
通过视图对表进行操作,最常用的一个视图结构,来进行增删改
create view v_t as select * from t where id > 10;
2.对于可以执行DML操作的视图,定义时可以带上WITH CHECK OPTION约束。该约束的作用是:对视图所做的DML操作的结果,不能违反视图的WHERE条件的限制
示例:
CREATE OR REPLACE VIEW v_stu ## OR REPLACE如果v_stu 视图已经存在则替换它
AS SELECT * FROM student
WHERE id < 5
WITH CHECK OPTION; ##只能对id小于5的数据进行增删改,也就是只能对
v_stu视图中的数据进行操作,可以对student表中的其他数据进行保护
3.什么时候或用到视图
(1)保护表中的其他数据不被增删改
(2)限制用户对表数据的访问范围
4.视图可以定义在另一个视图的上面,称为嵌套视图。
示例:
CREATE VIEW v_tea
AS SELECT *
FROM v_stu
WHERE id BETWEEN 6 AND 27; ##视图 v_tea的数据来自视图v_stu中id在6到27之间的数据
使用WITH CHECK OPTION约束时,可以使用CASCADED或者 LOCAL选项指定检查的程度:
WITH CASCADED CHECK OPTION:检查所有的视图(例如,嵌套视图及其底层的视图)
WITH LOCAL CHECK OPTION:只检查将要更新的视图本身(对嵌套视图不检查其底层的视图)
不指定选项则默认是CASCADED
视图权限
语法:
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
DEFINER选项:指出谁是视图的创建者或定义者。如果不指定该选项,则创建视图的用户就是定义者。指定关键字CURRENT_USER和不指定该选项效果相同
SQL SECURITY选项:要查询一个视图,首先必须要具有对视图的select权限。但是,如果同一个用户对于视图所访问的表没有select权限,那会怎么样?SQL SECURITY选项决定执行的结果:
1)SQL SECURITY DEFINER:创建视图的用户必须对视图所访问的表具有select权限
2)SQL SECURITY INVOKER:访问视图的用户必须对视图所访问的表具有select权限
不写SQL SECURITY选项等同于SQL SECURITY DEFINER
u1用户定义了视图,并且对视图的关联表有select权限,那么其他用户只需要对视图有select权限就可以查询表,不需要有表的任何权限,其他用户查询表的时候使用的是u1的select权限
示例:
(1)将密码复杂度设为最低,密码满足8位就可以
set global validate_password_policy=0;
(2)创建两个用户
create user ‘u1’@’%’ identified by ‘12345678’;
create user ‘u2’@’%’ identified by ‘12345678’;
(3)给u1用户赋权
grant select on test.kemu to ‘u1’@’%’; #u1用户可以访问test数据库的kemu表
(4)u1用户定义视图
create DEFINER= ‘u1’@’%’ SQL SECURITY DEFINER view v_kemu as select * from kemu;
(5)将视图的权限赋予u2
grant select on test.v_kemu to ‘u2’@’%’;
(6)使用u2登录数据库,可以访问视图u1用户定义了视图,其他用户对视图和表有读权限,u1用户对表不需要有任何权限
示例:
(1)将u1用户的对kemu的select权限去除
revoke select on kemu from ‘u1’@’%’
(2)赋予u2用户对kemu的select权限
grant select on test.kemu to ‘u2’@’%’;
(3)u1用户定义视图
create DEFINER= ‘u1’@’%’ SQL SECURITY DEFINER view v_kemu_1 as select * from kemu;(已
将之前的视图删除)
(4)赋予u2用户对视图的select权限
grant select on test.v_kemu_1 to ‘u2’@’%’;
(5)u2用户登录数据库,可以访问视图