sql-6-DDL-视图
什么是视图
视图是从一个或多个表或视图中导出的虚拟表。视图不存储实际数据,而是基于定义它的SQL查询结果。当你查询视图时,数据库会动态地执行视图的定义查询,将结果呈现出来。视图的主要目的是简化数据访问、提供数据安全性和抽象复杂查询结构。
视图的优点主要包括:
-
数据安全性:视图可以用来限制用户访问敏感数据,只显示他们需要看到的信息,而不暴露底层表的完整结构或敏感字段。
-
简化复杂查询:通过视图,可以将复杂的多表联接和筛选逻辑封装起来,使得用户只需要查询一个简单的视图即可得到结果。
-
逻辑数据隔离:视图可以隐藏表的结构变化,对于应用程序来说,即使底层表结构发生变化,只要视图接口保持不变,程序仍能正常工作。
-
简化数据操作:视图可以作为数据操作(如INSERT、UPDATE或DELETE)的入口点,简化对复杂数据的增删改操作。
-
数据聚合:视图可以预先完成一些计算或聚合操作,提高查询效率。
-
重复使用查询逻辑:视图可以作为一个查询模板,避免重复编写相同的SQL语句。
视图的缺点包括:
-
性能影响:每次查询视图时,数据库都需要执行底层的查询操作,这可能导致性能下降,特别是在视图定义复杂时。
-
不可更新性:某些视图可能由于其定义(如包含GROUP BY、DISTINCT或子查询)而不支持INSERT、UPDATE或DELETE操作,或者这些操作可能会变得复杂和受限。
-
数据不一致:如果底层表的数据发生变化,视图中的数据也会随之更新,但视图本身不会保存任何历史数据,可能会导致用户看到的数据不是最新的。
-
额外的管理开销:视图需要维护和更新,特别是当源表结构或权限发生变化时。
-
隐藏复杂性:视图可能使问题更难诊断,因为它掩盖了底层表和查询的复杂性。
创建视图
create view 视图名
as
查询语句 ;
示例:采用视图查询 员工编号、年薪、部门名称
select empno,sal*12,dname from emp e,dept d where e.deptno = d.deptno ;
改写为:
create view myempview
as
select empno 编号,sal*12 年薪,dname 部门名称 from emp e,dept d
where e.deptno = d.deptno ;
注意:视图中 的查询语句中,如果存在 字段的表达式,则必须给该表达式起别名.
视图分类
-
简单视图
- 表的数量 1个
- 函数没有
- 分组没有
-
复杂视图
- 表的数量 1个/多个
- 函数有
- 分组有
对视图的增删改
一般建议:视图只建议用于查询、分析,不要用于增删改。
视图不建议用于DML。但如果非要用DML,则必须满意以下条件:
-
①当出现以下之一时,不能Insert/update
- 组函数、group by、distinct、rownum、列的定义为表达式(
sal*12
)
- 组函数、group by、distinct、rownum、列的定义为表达式(
-
②当出现以下之一时,不能delete
- 组函数、group by、distinct、rownum
create view testview
as
select avg(sal) 平均工资,sum(sal) 总工资,job from emp group by job ;
--没有出现在组函数中的列,必须出现在group by后。
没有权限创建视图
普通用户第一次创建视图时,权限不足。
oracle:必须通过SYS授权。
grant create view to scott;
子句
with read only 确保只能对视图进行查询,不能增删改,oracle支持
create view baseview
as
select empno,ename,job from emp
with read only;//设置只读
with check option 确保对视图的操作,必须满足where子句,oracle和mysql都支持
create view empdeptno20
as
select * from emp where deptno=20
with check option;
WITH CHECK OPTION 子句简介
很多时候,创建一个视图以仅显示表的部分数据。但是,简单视图是可更新的。
因此可以通过视图更新不可见的数据。此更新使视图不一致。
要确保视图的一致性,请在创建或修改视图时使用 WITH CHECK OPTION 子句。
WITH CHECK OPTION子句是CREATE VIEW声明的可选部分。
WITH CHECK OPTION子句阻止您更新或插入通过视图不可见的行。换句话说,每当通过视图更新或插入基表的一行时,MySQL都会确保插入或更新操作符合视图的定义。
WITH CHECK OPTION: 这个选项用于确保任何试图通过视图进行的INSERT或UPDATE操作必须满足视图定义中的WHERE子句或其他限制。在你给出的例子中,empdeptno20视图只包含deptno为20的员工记录。如果尝试通过这个视图插入或更新一条记录,系统会检查新记录的deptno是否仍然等于20。如果不符合条件,操作将被拒绝。
mysql的视图处理算法
算法属性允许您控制MySQL在创建视图时使用的机制。MySQL提供三种算法: MERGE,TEMPTABLE,和UNDEFINED。
- 使用MERGE算法,MySQL首先将输入查询与SELECT定义视图的语句组合成单个查询。然后MySQL执行组合查询以返回结果集。 如果SELECT语句包含聚合函数,例如 MIN,MAX,SUM,COUNT,AVG 或DISTINCT,GROUP BY,HAVING,LIMIT,UNION,UNION ALL,子查询,则不允许使用MERGE算法。如果SELECT语句引用无表,则也不允许MERGE算法。如果不允许MERGE算法,MySQL将算法更改为UNDEFINED。请注意,将视图定义中的输入查询和查询组合到一个查询中称为视图分辨率。
- 使用TEMPTABLE算法,MySQL首先根据定义视图的SELECT语句创建临时表,然后对临时表执行输入查询。因为MySQL必须创建一个临时表来存储结果集并将数据从基表移动到临时表,所以TEMPTABLE 算法的效率低于MERGE算法。此外,使用TEMPTABLE 算法的视图不可更新。
- 在未指定显式算法的情况下创建视图时,这是默认UNDEFINED算法。UNDEFINED算法允许MySQL选择使用 MERGE或TEMPTABLE 算法。MySQL更喜欢MERGE 算法在TEMPTABLE 算法中,因为 MERGE算法效率更高。