欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

数据库(MySQL)基础]MySQL中的视图、存储过程和触发器 - 1. 视图

最编程 2024-04-15 09:36:30
...

视图是虚拟存在的表,通过实际的数据库表来生成面向不同用户和不同角色的视图(不同角色所需内容不一样)

1.1 视图创建

Create [or replace] View 视图名称 As (Select语句) [WITH [CASCADED|LOCAL] CHECK OPTION]

其中replace表示替换视图,感觉应该就是更新视图的意思?

1.2 视图查询

查询创建视图语句:show create view 视图名称,查出来的雨具包括原始创建视图语句中没有写的一些默认参数

查看视图数据:select * from 视图名称(类似于查询表一样的操作)

1.3 视图修改

方式一:修改视图可以用创建视图的语句,但是重点主要在于Replace,把视图内容替换掉,Create or Replace View 视图名称 As (Select语句)

方式二:Alter View 视图名称 As (Select)语句

1.4 视图删除

Drop View [If Exists] 视图名称

1.5 视图检查选项

使用WITH CHECK OPTION自居创建视图时,MySQL会通过视图检查正在更改的每个行,如插入,更新,删除,使其符合视图定义。MySQL允许基于另一个视图创建视图,还会检查依赖视图中的规则以保持一致性。

1.5.1 cascaded检查选项

Cascaded选项表明操作是否满足当前视图约束当前视图所依赖视图的约束(父视图,递归检查所有的父视图)并不检查它的子视图(依赖于它的视图)

如果子视图自身没有约束,也会向上检查父视图,只要有父视图存在约束就不断向上检查

1.5.1.1 这个选项存在为了避免什么问题?

假设我们建立视图的语句为:create or replace view stu_v_1 as select id, name from student where id <= 20

那么我们可以通过select * from stu_v_1来查询视图中的内容

如果我们向视图中插入数据insert into stu_v_1 values(6,'Tom')insert into stu_v_1 values(30,'Tom'),因为视图实际上不是存储数据的载体,表实际上才是存储数据的载体,所以这里向视图插入的数据会存储到实际的表中去

再次通过select * from stu_v_1来查询视图,发现无法查到id=30的那条数据,但实际上,我们是希望语句能够“插入”到视图中去的,也就是通过视图查询语句,我们可以查到id=30的数据

1.5.1.2 怎么利用这个选项

建立视图的语句修改成create or replace view stu_v_1 as select id, name from student where id <= 20 with cascaded check option

这时候执行insert into stu_v_1 values(30,'Tom')会报错:CHECK OPTION failed ‘…’

1.5.1.3 子视图

假如创建视图stu_v_1的语句是:create or replace view stu_v_1 as select id, name from student where id <= 20

创建了一个源自stu_v_1的语句stu_v_2create or replace view stu_v_2 as select id, name from stu_v_1 where id >= 10 with cascaded check option

下列插入语句:

  • insert into stu_v_2 values(7,'Tom')

  • insert into stu_v_2 values(26,'Tom')

  • insert into stu_v_2 values(15,'Tom')

的执行,是成功还是失败?

语句1,id=7的会执行失败,因为其不满足id>=10的约束

语句2,id=26的会执行失败,因为其不满足父视图id<=20的约束

语句3,id=15同时满足>=10&&<=20,执行成功


假如再创建一个源自stu_v_2的视图stu_v_3create or replace view stu_v_3 as select id, name from stu_v_2 where id <= 15

下列插入语句:

  • insert into stu_v_3 values(11, 'Tom')

  • insert into stu_v_3 values(17, 'Tom')

  • insert into stu_v_3 values(28, 'Tom')

的执行,是成功还是失败?

语句1,id=11的会执行成功,向上检查stu_v_2stu_v_1的约束,分别是>=20<=20

语句2,id=17的会执行成功,因为stu_v_3没有加wiith cascaded check option,所以不会检查其自身的约束,而是向上检查2和1两个视图的约束,满足,则可以执行成功

语句3,id=28的会执行失败,因为不满足stu_v_1的约束。

1.5.2 local检查选项

若本级添加了with local check option,检查操作是否满足当前这一条的约束,向上递归检查所有父亲视图(包括父视图、父视图的父视图…),若父亲视图有with cascaded/local check option则根据父亲视图条件进行校验,若没有则不校验(基于MySQL 8.0)

1.5.2.1 local示例

视图1:create view stu_v_1 as select id, name from student where id <= 15

视图2:create view stu_v_2 as select id, name from stu_v_1 where id >= 10 with local check option

视图3:create view stu_v_3 as select id, name from stu_v_2 where id < 20

下列插入语句:

  • insert into stu_v_1 values(5, 'Tom')

  • insert into stu_v_1 values(16, 'Tom')

  • insert into stu_v_2 values(13, 'Tom')

  • insert into stu_v_2 values(17, 'Tom')

  • insert into stu_v_3 values(14, 'Tom')

的执行,是成功还是失败?

语句1、2:执行成功,因为没有加入检查选项

语句3、4:执行成功,满足stu_v_2的条件,去找stu_v_1发现它没有加检查选项,所以不需要根据stu_v_1表的条件判断

语句5:执行成功,stu_v_3视图没有加入约束,所以不检查当前视图的条件;向上去找父亲视图stu_v_2的条件,发现有local的约束,则检查,满足约束;再向上找父亲视图stu_v_1,发现没有加检查约束,则不检查。说明满足约束,执行成功。

1.6 视图更新及作用

并不是所有的视图都可以更新,那么要考虑的是符合什么条件的的视图可以更新?

要使视图可更新,则视图中的行与基础表中的行之间必须存在一对一关系。如果视图包含以下任何一项,则该视图不可更新:

  1. 聚合函数或窗口函数(SUM,MIN,MAX,COUNT等);

  2. DISTINCT

  3. GROUP BY

  4. HAVING

  5. UNION或者UNION ALL

create view stu_v_count as select count(*) from student创建的视图不可以更新


视图的作用:

  • 简单:简化用户对数据的理解,简化他们的操作。经常被使用的查询可以被定义为视图,从而使得用户不必为以后得操作每次指定全部的条件。

  • 安全:数据库可以授权,但不能授权到数据库特定行和特定列上。通过视图用户只能查询和修改他们所能见到的数据(如学生表有学生号、学生名、班级名,可以通过视图隐藏不想让用户看到的班级名,避免用户对班级名的操作)

  • 数据独立:视图可以帮助用户屏蔽真实表结构变化带来的影响(如学生表中的学生名属性要rename成名属性,可以通过select 名 as 学生名,使得用户看到属性的名称仍为学生名,表结构的变化不会对用户造成影响)

推荐阅读