MySQL从5.5开始使用视图,视图可以使用户操作方便,并且为数据库安全提供一层保障。
视图是一个虚拟表,是从数据库中的一个或多个表中导出的表,视图也可以在已经存在的视图基础上创建。
视图定义后存储在数据库中,与其对应的数据不会在数据库中再存储一份,通过视图查询到的数据仍然存储在基本表中。对视图的操作与对表的操作一样,可以对其进行增删改查。通过视图修改数据时,基表中的数据会被修改,同样,基表数据被修改时也会反映在视图中。
作用
- 简单化
看到的就是需要的。视图可以简化用户对数据的理解,也可简化操作。将经常使用的查询定义为视图,使用户不必再每次操作时指定全部条件。 - 安全性
通过视图用户只能查询和修改他们能看到的数据,数据库中的其他数据看不到也不能修改。数据库授权命令可将每个用户对数据库的操作限制到特定的数据库对象上,但不能将权限限定到特定的数据行或列,通过视图可将用户操作的数据限制到特定子集上包括基表的行的子集,列的子集,行和列的子集,多个基表的连接所限定的行上,基表数据的统计汇总数据集,另一个视图的子集,视图和基表合并的子集。 - 逻辑数据独立性
可帮助用户屏蔽基表结构变化带来的影响。
创建视图
视图中包含了select语句查询的结果,因此视图的创建基于select语句和已经存在的数据表,视图可以建立在一张表上,也可以建立在多张表上。创建视图使用create view语句,语法格式如下:
create [or replace] [algorithm={undefined|merge|temptable}]
view view_name[(column_list)]
as select...
[with [cascade|local] check option]
create:创建新视图
replace:替换视图
algorithm:视图选择算法
view_name:视图名
column_list:属性列
with [cascade|local] check option:视图在更新时保证在视图的权限范围之内
algorithm的三个取值:
undefined:自动选择算法
merge:将使用的视图语句和视图定义合并起来,使得视图定义的某一部分取代语句对应的部分
temptable:将视图的结果存入临时表,用临时表执行语句
cascade:默认值,表示更新视图时要满足所有相关视图和表的条件
local:更新视图时满足视图本身定义的条件即可
该语句要求具有针对视图的create view权限,以及有select语句选择的列上的权限,如果有or replace语句,必须在视图上有drop权限
视图属于数据库。默认情况下,在当前数据库创建视图,要想明确在哪个数据库中创建视图,创建时指定db_name.view_name
在单表上创建视图
create view emp_view as select name,salary,salary*12 from tb_emp;
使用视图查询
select * from emp_view;
默认情况下,视图字段与查询语句字段一致,也可以指定视图字段:
create or replace view emp_view(姓名,月薪,年薪)
as select name,salary,salary*12 from tb_emp;
用户在使用视图时不需要了解基表结构,更不会接触实际表中的数据,从而保证数据的安全性。
在多表上创建视图
create view emp_dept_view
as select
e.name ename,e.salary,e.deptId,d.name
from tb_emp e,tb_dept d
where e.deptId=d.id
查看视图
使用describe(desc)
desc view_name
结果显示视图的字段定义,字段的数据类型,是否为空,是否为主键外键,默认值和额外信息。
使用show table status
show table status like 'view_name'
结果中,comment的值为view说明该表为视图,其他信息为null说明这是一张虚表,也可以通过这条语句查看数据表的信息
show table status like 'table_name'
结果中包含了存储引擎,创建时间等。comment数据为空,这就是表和视图的区别。
show create view
show create view view_name
结果显示视图名称,创建语句等信息
在views表中查看视图详细信息
在information_schema数据库中有表views
select * from information_schema.views;
修改视图
修改视图指修改数据库中已经存在的视图,当基表的结构发生变化时可通过修改视图保持与基表的一致性。
通过create or replace view语句修改
与创建视图语句一致
alter语句
alter [algorithm={undefined|merge|temptable}]
view view_name[(column_list)]
as select...
[with [cascade|local] check option]
更新视图
更新视图指通过视图增删改表中的数据,因为视图是一个虚拟表,其中没有数据,通过视图进行数据更新都是转到基本表中更新的,对视图增加或删除记录实际是对基本表数据进行增加或删除。
在定义视图时如果使用了数学表达式,集合函数等可能会造成视图不能更新。
通过外连接语句生成的视图是不能更改其中数据的
删除视图
drop view [if exists] view_name[,view_name...] [restrict|cascade]