MySQL:12_视图
视图
- 跟事务里讲的视图没有任何关系
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
一.基本使用
- 创建视图
create view 视图名 as select语句;
- 案例
create view v_ename_dname as select ename, dname
from EMP, DEPT where EMP.deptno=DEPT.deptno;
- 修改了视图,对基表数据有影响
select emp.ename,dept.dname,dept.deptno from emp,dept where
emp.deptno=dept.deptno order by dname;
update v_ename_dname set ename='TEST' where ename='CLARK';
select * from EMP where ename='CLARK';
select * from EMP where ename='TEST';
- 修改了基表,对视图有影响
- 删除视图
drop view 视图名;
二.视图规则和限制
视图建议以查为主
- 与表一样,必须唯一命名(不能出现同名视图或表名)
- 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
- 视图不能添加索引,也不能有关联的触发器或者默认值
- 视图可以提高安全性,必须具有足够的访问权限
- order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的 order by 将被覆盖(创建视图时select语句里面的order by会被视图查询时使用的order by覆盖)
- 视图可以和表一起使用
三.实战OJ
牛客:针对actor表创建视图actor_name_view
四.总结
(一).介绍
视图是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的
通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图时,主要的工作就落在创建这条SQL查询语句上
(二).基本语法
1. 创建:
create [or replace] view 视图名称[(视图列表)] AS select语句[ with [ cascaded | local ] check option]
# with check option默认是local的
不写WITH [CASCADED | LOCAL] CHECK OPTION
这一部分,那么默认不启用任何 CHECK OPTION
约束。
例子:
create view vip_customers as select * from customers where acct_bal > 10000;
#可以通过这个视图执行 insert 或 update,哪怕插入的数据不满足 acct_bal > 10000,数据库也不会报错,它会照样写入到底层表中。
create view china_customers as select * from customers where nation = 'china';create view vip_china_customers as
select * from china_customers where acct_bal > 10000 with local check option;
#local check option表示:只检查本视图的条件(acct_bal > 10000)插入或更新时,不会检查上一层china_customers的nation='china'条件create view vip_china_customers_strict as
select * from china_customers where acct_bal > 10000 with cascaded check option;
#cascaded check option表示:检查当前视图和所有上层视图的条件,插入或更新的数据必须同时满足acct_bal > 10000和nation='china'
- 对比
写法 | 行为 |
---|---|
不写 WITH CHECK OPTION | 视图不限制通过它插入或更新的数据是否满足视图定义条件 |
写 WITH LOCAL CHECK OPTION | 仅限制当前视图定义中 WHERE 条件满足即可 |
写 WITH CASCADED CHECK OPTION | 限制所有层级(自身及其依赖视图)都满足 |
- 总结
如果不写 WITH CHECK OPTION
,那就什么检查都没有;允许你通过视图插入/修改任何数据,即使这些数据插入后不会出现在视图里。
2. 查询:
查看创建视图语句:
show create view 视图名称;
查看视图数据:
select * from 视图名称……;
3. 修改:
- 方法一:
create [or replace] view 视图名称[(视图列表)] as select语句[ with [ cascaded | local ] check option]
# or replace视图如果存在就替换
- 方法二:
alter view 视图名称[(视图列表)] as select语句[with [cascaded | local ] check option ]
4. 删除:
drop view [if exists] 视图名称 [,视图名称]
(三).视图-检查选项
1. cascaded
(1).通过with check option子句创建视图时,MySQL会通过视图检查正在更改的每一行,例如插入,更新,删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,他还会检查依赖视图中的规则以保持一致性。为了确定检查范围,mysql提供了两个选项cascaded和local默认值为cascaded
(2).cascaded:对于关联的视图条件也会检查
2. local
local有则检查,没有则不对条件进行检查
(四).更新
视图的更新:视图中的行与基础表中的行之间必须存在一对一的关系,如果包括以下任何一项则不可更新:
-
(1)聚合函数或者窗口函数(SUM() , MIN() , MAX() , AVG() COUNT() )
-
(2)distinct
-
(3)group by
-
(4)having
-
(5)union union all
(五).作用
-
简单:简化用户对数据的理解,也能简化操作。
-
安全:数据库可以授权,但不能授权到特定的行和列,通过视图可以查询和修改他们所能看见的数据
-
数据独立:帮助用户屏蔽真实表结构带来的影响