视图是从一个或多个表导出来的表,是一种虚拟存在的表。视图就像是一个窗口,通过这个窗口可以看到系统专门提供的数据,这样用户可以不用看到整个数据库中的数据,而只是关心对自己有用的数据。视图可以使用用户的操作更方便,而且可以保障数据库系统的安全性。
为了提高复杂SQL语句的复用性和表的操作的安全性,MySQL数据库管理系统提供了视图特性。视图行和列数据来自定义视图的查询所引用的基本表,在具体引用视图时动态生成。
- 特点:
- 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系
- 是由基本表(实表)产生的表(虚表)
创建视图
create (or replace) [algorithe =undefined|merge|template]
view viewname [columlist]
as select statement
[with [cascaded|local] check option]
create表示创建新的视图;replace表示替换已经创建的视图;algorithm表示视图选择的算法;viewname表示视图的名称;columnlist为属性列;select statement表示select语句;参数with [ cascaded| local] check option 表示视图在更新是保证在视图的权限范围之内。
algorithm 的取值有3个:undefined表示mysql将自动选择算法;merge表示将使用的视图语句与视图定义结合起来,使得视图定义的某一部分取代语句对应的部分;template表示将视图的结果存入临时表,然后用临时表来执行语句。
cascaded与local为可选参数,cascaded为默认参数,表示更新视图时要满足所有相关视图和表的条件,而local表示更新视图时满足该视图本身定义的条件即可。
单表上创建视图
create view view_selectemployee AS
select id,name,gender,age,deptno from t_employee;
多表上创建视图
create algorithm=merge view
view_dept_employee(name,dept,gender,age,loc)
AS select name,t_dept.deptname,gender,age,t_dept.location from t_employee,t_dept
where t_employee.deptno = t_dept.deptno
with local check option;
查看视图
- 使用 describe | desc 语句查看视图基本信息
describe | desc viewname;
- 使用 show table status 语句查看视图基本信息
show table status from databasename [like 'table or view'];
- 使用show create view 语句查看视图详细信息
修改视图
- 使用create or replace view 语句修改视图
在视图已经存在的情况下,对视图进行修改;视图不存在的情况下,可以创建视图。 - 使用ALTER语句修改视图
alter [algorithe =undefined|merge|template] view viewname [columlist] as select statement [with [cascaded|local] check option]
更新视图
更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟表,其中没有数据,通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内数据,超出了范围,就不能更新。
- SQL语句更新视图
# 创建视图 CREATE VIEW view_selectdept(name,product,loc) AS SELECT deptname,product,location FROM t_dept where deptno=1; # 更新视图 UPDATE view_selectdept SET name='hr_department',product='hr_system',loc='east_10'; # 等价于 UPDATE t_dept SET deptname='hr_department',product='hr_system',location='east_10' WHERE deptno=1;
即对视图的更新相当于对基本表的更新。
- 更新基本表后视图自动更新
- 不能更新的视图
对视图的更新最后都是实现在基本表上,更新视图时,实际上更新的是基本表上的记录。
- 视图包含sum(),count(),max(),和min()等函数。
- 视图中包含union(),union all,distinct,group by 和having等关键字
- 常量视图
- 视图中的select 中包含子查询
- 由不可更新的视图导出的视图
- 创建视图时,algorithm为temptable类型
删除视图
删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。
drop view viewname[,viewname];
注: 本文参考《Mysql 5.7 从入门到实践》张婷 一书。