Mysql(视图)

发布于:2025-07-25 ⋅ 阅读:(24) ⋅ 点赞:(0)

目录

增加视图

修改视图

删除视图

视图的插入

从视图中查询

测试用例

视图的检查选项:

测试 with cascaded option

 测试 with local check option

视图的更新:

视图作用:


视图(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即可)(个人感觉这就是屁话,文绉绉的)
视图可帮助用户屏蔽真实表结构变化带来的影响。


网站公告

今日签到

点亮在社区的每一天
去签到