第四章 视图
创建视图
语法形式:
create [algorithm = {undefined|merge|temptable}] view 视图名 [(属性清单)] as select语句 [with [cascaded|local] check option]
1.algorithm 可选参数,表示视图选择的算法
undefined表示自动选择
merge表示将使用视图的语句与视图定义合并起来,使得视图定义的某一部分吧取代语句的对应部分。
temptable表示将视图的结果存入临时表,然后使用临时表执行语句。
2.cascaded 表示更新视图需要满足所有相关视图和表的条件
3.local 表示更新视图时,要满足视图本身的定义条件即可
注:
创建视图最好加上with check option 参数,而且加上cascaded参数,这样,从视图派生的新视图更新时需要考虑父视图的约束条件,保证数据安全
查询创建视图权限:
select select_priv,create_view_priv from mysql.user where user='用户名';
创建两张表
创建视图前先创建两张表department和worker
mysql> create table department(
d_id int(4) primary key,
d_name varchar(20) not null unique,
function varchar(50),
address varchar(50));
mysql> create table worker(
num int(10) primary key,
d_id int(4) not null,
name varchar(20),
sex varchar(4) not null,
birthday datetime,
homeaddress varchar(50),
constraint w_fk foreign key (d_id) references department(d_id));
在单表上创建视图
mysql> create view department_view1 as select * from department;
使用desc查看视图结构:
mysql> desc department_view1;
在未指定视图的属性列表时,视图的属性名与select语句查询的属性名相同
mysql> create view department_view2(name,function,location) as select
-> d_name,function,address from department;
在多表上创建视图
mysql> create algorithm=merge view worker_view1(name,department,sex,age,address)
-> as select name,department.d_name,sex,2016-birthday,address
-> from worker,department where worker.d_id=department.d_id
-> with local check option;
注:2016-birthday表示获取的birthday,再用2016去减,得到的结果就是age
查看视图
1.describe语句查看简单视图
describe 视图名;
也可以使用一些缩写:
desc 视图名;
2.show table status语句查看视图基本信息
3.show create view查看详细信息
4.在views表查看视图
修改视图
1.create or replace
语法形式:
create or replace [algorithm = {undefined|merge|temptable}] view 视图名 [(属性清单)] as select语句 [with [cascaded|local] check option]
若不存在则创建视图
2.alter
alter [algorithm = {undefined|merge|temptable}] view 视图名 [(属性清单)] as select语句 [with [cascaded|local] check option]
更新视图
查看原表内容:
先创建待更新的视图
mysql> create view department_view3(name,function,address)
-> as select d_name,function,address from department where d_id=1001;
向该视图更新一条记录
mysql> update department_view3 set name='人事部',function='管理人事变动',address='2#5f';
虽然更新的是视图,但实际更新的是表department
注:以下情况不能更新视图
(1)包含count(),sum(),max(),min()函数
create view worker_view4(name,sex,total) as select name,sex,count(name) from worker;
(2)视图中包含union,union all,distinct,group by,havig等 关键字
create view worker_view5(name,sex,address) as select name,sex,homeaddress from worker group by d_id;
(3)常量视图
create view worker_view6 as select 'tom' as name;
(4)视图中的select包含子查询
create view worker_view7 (name) as select (select name from worker);
(5)由不可更新的视图导出的视图
(6) algorithm为temptable类型时,视图不可更新
(7) 视图对应的表存在没有默认值的列,且该列不再视图中。
当视图更新时,这样的列没有值插入,也没有null值插入,这是不允许的。
注:最好将视图表作为查询表,而不做更新操作
删除视图
drop view [if exists] 视图名列表 [restrict|cascade]