什么是视图

目录

一、什么是视图

二、视图的作用

三、创建视图

四、使用视图

1.使用视图查询员工信息

五、注意事项

六、补充


一、什么是视图

视图是基于查询的虚拟表,是一个逻辑表,本身并不包含数据。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图就是一条SELECT语句执行后返回的结果集。

SELECT所查询的表称为视图的基表,而查询的结果集称为虚拟表,视图本身并不存储具体的数据,视图的数据存在于视图的基表中,基本表数据发生了改变,视图的数据也会跟着变化。

二、视图的作用

使用视图是为了方便复杂的查询语句。基本思路是将复杂的查询语句定义在视图内部,然后对视图进行查询,从而简化复杂的查询语句。

为什么要使用视图?

视图的诸多优点如下:

  1. 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
  2. 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某一行某一列,但是通过视图就可以简单的实现。
  3. 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响,源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。

三、创建视图

CREATE VIEW 视图名
AS
SELECT列1,列2...
FROM 表;

修改视图:

ALTER VIEW 视图名 AS SELECT 语句

显示视图创建:

SHOW CREATE VIEW 视图名;

 查看视图:

SHOW TABLES;
-- 当作普通表使用

删除视图:

DROP VIEW 视图名[,视图名...];

 重命名视图:

RENAME TABLE 视图名 TO 新视图名;

四、使用视图

需求:查询员工信息,要求显示员工编号、姓名、所属的部门。

select empno,ename,dname 
from emp inner join dept on emp.deptno=dept.deptno;

这是两张表连接查询,如果查询涉及的表越多,查询变得越复杂。 

1.使用视图查询员工信息

定义视图:

CREATE VIEW v_emp
AS
SELECT empno,ename,dname FROM emp INNER JOIN dept ON emp.deptno = dept.deptno;

使用试图:

select * from v_emp

 

五、注意事项

  1. 视图的主要作用与查询相关。
  2. 可以通过视图插入数据,但只能基于一个基表进行插入,不能同时向多个基表插入数据。

insert into v_emp(empno,dname) values(10,'测试') ;

3. 可以通过视图修改数据,但只能基于一个基表进行修改,不能同时修改多个基表的数据。

4. 可以通过视图删除数据,但只能删除单表查询的视图,不能删除多表连接查询视图中的数据。

5.虽然通过视图也可以对数据进行添加、删除、修改,但不推荐。

6.使用drop view语句可以删除视图。

7.select语句不能引入系统或用户变量。

六、补充

CREATE [OR REPLACE] [ALGORITHM={UNDEFINED | MERGE | TEMPTABLE}] VIEW 视图名[(列1,列
2...)] AS SELECT (列1,列2...)
[WITH [CASCADE | LOCAL] CHECK OPTION]
  • on replace:如果已有同名视图则替换。
  • algorithm:视图算法。
  • undefined:MySQL将自动选择所要使用的算法。
  • merge:将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句对应部分。
  • temptable:将视图的结果存入临时表,然后使用临时表执行语句。

 缺省algorithm选项等同于algorithm=undefined

  • check option:表示修改视图时,检查插入的数据是否符合where设置的条件。
  • cascaded/local:表示check option的范围。
  •  当不加local或cascaded时,默认为cascaded。
  • local表示只验证当前视图,检查所依赖的视图有没有检查选项,如果有就会检查所依赖的视图,没有就不检查,cascaded表示所依赖的视图会带上检查选项。
  • 该语句的作用:

         update时,要保证数据update之后能被视图查询出来,也就是要符合where的条件

         insert时,保证insert的数据能被视图查询出来。

         delete时,有无with check option都一样

         对于没有where字句的视图,使用with check option是多余的。

-- 没有 with check option
create view v_emp
as select * from emp;
-- 有 with check option, 视图 sql 中没有 where 所以 with check option 没啥作用
create or replace view v_emp
as select * from emp with check option; -- 相当于 with cascaded check option
-- 有 with check option
create or replace view v_emp
as select * from emp where sal > 2000
with check option;
select * from v_emp;
-- 修改视图值
update v_emp set sal = 2100 where empno = 7788;
-- 通过原表修改
update emp set sal = 10 where empno = 7788;
-- with local check option cascaded
create or replace view v_emp
as select * from emp where sal > 2000;
create or replace view v_v_emp as select * from v_emp where sal > 1000 with local
check option;
select * from v_v_emp;
-- local 只管当前视图
update v_v_emp set sal = 1900 where empno = 7788;
-- cascaded 表示底层视图也要验证
create or replace view v_emp
as select * from emp where sal > 2000;
create or replace view v_v_emp as select * from v_emp where sal > 1000 with cascaded
check option;
update v_v_emp set sal = 1900 where empno = 7788;

你可能感兴趣的:(MySQL,数据库)