目录
视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。
通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。
create view v1 as select * from stuTable,这就是视图,就是把查询sql语句封装一下。
语法
增加视图
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)]AS SELECT语句 [WITH[CASCADED|LOCAL] CHECK OPTION]
--[OR REPLACE] 创建视图时如果存在就替代,可不加,推荐加
--[WITH[CASCADED|LOCAL] CHECK OPTION] 检查选项,下面有讲
--查看创建视图语句:
SHOW CRETE VIEW 视图名称;
例如:
修改视图
创建视图和修改视图都可以使用 CREATE [OR REPLACE] VIEW 视图名称(列名列表) AS SELECT语句 [WITH[CASCADEDLLOCAL] CHECK OPTION 方式一这句,也建议使用方式一,好记。
--修改视图:
--方式一:
CREATE [OR REPLACE] VIEW 视图名称(列名列表) AS SELECT语句 [WITH[CASCADEDLLOCAL] CHECK OPTION
--方式二:
ALTER VEW 视图名称(列名列表) AS SELECT语句 [WITH[CASCADED|LOCAL]CHECK OPTION]
例如
-- 修改视图
create or replace view stu_v_1 as select id, name, age from student where id <= 10;
alter view stu_v_1 as select id, name from student where id <= 10;
删除视图
-- 删除视图
DROP VIEW [IF EXISTS]视图名称[,视图名称]
例如
drop view if exists stu_v_1;
视图的插入
INSERT INTO YOURVIEW (col[,col...]) VALUES(value1[,value2...])
例如
insert into stu_v_1 (id,name) values(30,'tom')
--和向表中插入数据一样
从视图中查询
SELECT col[,col] form YourView
例如
select * from stu_v_1;
--和向表中查询数据一样
测试用例
create or REPLACE VIEW stu_view as SELECT id,name FROM student WHERE id < 20
INSERT INTO stu_view (id,name) VALUES (23,"小k")
select * form student
SELECT * FROM stu_view
上图发现,如果加上where条件,student表中可以正常插入,stu_view视图里因为不符合where条件,所以过滤了,并且插入时没有任何提示,现在有一种情况,如果不符合条件,我想让mysql提示一下,并且禁止插入表中,这时就需要用到检查选项。
视图的检查选项:
测试 with cascaded option
stu_view3继承自stu_view2,stu_view2继承自stu_view1,stu_view1继承自student表
create or REPLACE VIEW stu_view1 as SELECT id,name FROM student WHERE id < 20
create or REPLACE VIEW stu_view2 as SELECT id,name FROM stu_view1 WHERE id > 10 WITH CASCADED CHECK OPTION
create or REPLACE VIEW stu_view3 as SELECT id,name FROM stu_view2 WHERE id <= 15
INSERT INTO stu_view3 (id,name) VALUES (11,"小d")
INSERT INTO stu_view3 (id,name) VALUES (17,"小f")
INSERT INTO stu_view3 (id,name) VALUES (28,"小g")
结果
插入id | stu_view3 | stu_view2 | stu_view1 |
11 | 没有with check option, 符合<=15,通过 |
有check,通过传给stu_view1 | stu_view2传递check,也有check符合条件通过,可以插入student表 |
17 | 没有with check option,虽然不符合<= 15,也通过 | 有check,通过传给stu_view1 | stu_view2传递check,也有check,符合条件通过,可以插入student表 |
28 | 没有with check option,虽然不符合<= 15,也通过 | 有check,通过传给stu_view1 | stu_view2传递check,也有check,不符合条件,check报错,不能插入student表 |
注:依赖视图查询出来的结果要满足它所依赖的视图的所有条件
例如
create or REPLACE VIEW stu_view1 as SELECT id,name FROM student WHERE id < 20
create or REPLACE VIEW stu_view2 as SELECT id,name FROM stu_view1 WHERE id > 15 WITH CASCADED CHECK OPTION
create or REPLACE VIEW stu_view3 as SELECT id,name FROM stu_view2 WHERE id <= 30
--student表中有1,2,11,16,17,28
SELECT * FROM stu_view3 --[id > 15 && id <20 && id <= 30]
--查询结果只有16,17
测试 with local check option
因为不具有传递性,不可能在v1报错,只有在含有with local check option且不符合条件的v2视图才报错,
local:adj 本地的
实验结果显而易见,这里不再赘述。
视图的更新:
要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。
如果视图包含以下任何一项,则该视图不可更新:
聚合函数或窗口函数(SUM()、MIN()、MAX()、COUNT()等
DISTINCT --去重
GROUP BY
HAVINGA
UNION 或者 UNION ALL
视图作用:
简单 (人话就是,本来要where条件查询语句,现在封装成视图)
视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
安全 (表中的Password可以屏蔽掉)
数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据。
数据独立(原表name变成stuname,视图变成create or REPLACE VIEW stu_view2 as SELECT id,stuname as name FROM stu_view1即可)(个人感觉这就是屁话,文绉绉的)
视图可帮助用户屏蔽真实表结构变化带来的影响。