什么是视图
目录
一、什么是视图
二、视图的作用
三、创建视图
四、使用视图
1.使用视图查询员工信息
五、注意事项
六、补充
一、什么是视图
视图是基于查询的虚拟表,是一个逻辑表,本身并不包含数据。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图就是一条SELECT语句执行后返回的结果集。
SELECT所查询的表称为视图的基表,而查询的结果集称为虚拟表,视图本身并不存储具体的数据,视图的数据存在于视图的基表中,基本表数据发生了改变,视图的数据也会跟着变化。
二、视图的作用
使用视图是为了方便复杂的查询语句。基本思路是将复杂的查询语句定义在视图内部,然后对视图进行查询,从而简化复杂的查询语句。
为什么要使用视图?
视图的诸多优点如下:
- 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
- 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某一行某一列,但是通过视图就可以简单的实现。
- 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响,源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。
三、创建视图
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
五、注意事项
- 视图的主要作用与查询相关。
- 可以通过视图插入数据,但只能基于一个基表进行插入,不能同时向多个基表插入数据。
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;