第四章 视图

创建视图

语法形式:

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='用户名';

   

创建两张表

创建视图前先创建两张表departmentworker

   

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]

 

posted @ 2016-05-24 21:31  且听风吟-wuchao  阅读(259)  评论(0编辑  收藏  举报