1.视图概述
2.创建视图
CREATE [OR REPLACE] VIEW view_name [(column_list)] AS SELECT_statement [WITH { CASCADED | LOCAL} CHECK OPTION] # OR REPLACE:可选项,用于指定OR REPLACE子句,该语句用于替换数据库中已存在的同名视图,但需要该视图上具有DROP权限。 # view_name:指定视图名称。视图名称在数据库中必须唯一。 # column_list:为每个列指定明确的名称。 # SELECT_statement:指定创建视图的SELECT语句。 # WITH CHECK OPTION:可选项,用于指定在可更新视图上所进行的修改都需要符合select_statement中所指定的限制条件。
# 在数据库中创建视图v_student,要求该视图包含客户信息表tb_student中所有男生的信息,并且保证今后对该视图数据的修改都必须符合学生性别为男性这个条件。 create or replace VIEW v_student as select * from tb_student where sex='男' WITH CHECK OPTION;
# 创建视图v_score_avgs,要求视图包含表tb_score中所有学生的学号和平均成绩,并按学号studentNo进行排序。 create or replace VIEW v_score_avgs as select studentNo,avg(score) from tb_score group by studentNo;
# 使用WITH CHECK OPTION子句创建视图v_score,要求该视图包含表tb_score中所有score<90的学生学号、课程号、成绩信息。 create VIEW v_score as select * from tb_score where score<90 WITH CHECK OPTION;
3.删除视图
# 语法结构: drop VIEW [if exists] view_name;
# 删除视图v_score、v_score_local、v_score_cascaded drop VIEW if exists v_score,v_score_local,v_score_cascaded;
4.修改视图定义
alter VIEW view_name [(column_list)] as SELECT_statement [WITH [CASCADED | LOCAL] CHECK OPTION];
# 使用ALTER VIEW语句修改视图v_student的定义,要求该视图包含tb_student中性别为‘男’,民族为‘汉’的学生的学号、姓名、所属班级,并且要求保证今后对该视图数据的修改都必须符合学生性别为‘男’,民族为‘汉’这个条件。 alter VIEW v_student (studentNo,studentName,classNo) as select studentNo,studentName,classNo from tb_student where sex='男' and nation='汉' WITH CHECK OPTION;
5.查看视图定义
# 语法结构: SHOW CREATE VIEW view_name;
# 查看数据库v_student的定义 show create VIEW v_student;
6.更新视图数据
6.1 使用insert语句通过视图向基础表插入数据
# 向视图v_student中插入一条记录:('2014310109','周明','男','1997-08-16','湖北','汉','IS1401') insert into v_student values ('2014310109','周明','男','1997-08-16','湖北','汉','IS1401'); select * from v_student;
6.2 使用update语句通过视图修改基础表的数据
# 将视图v_student中所有学生的native列更新为"湖北" update v_student set native='湖北';
6.3 使用delete语句通过视图删除基础表的数据
# 删除视图v_student中姓名为'周明'的学生信息 delete from v_student where studentName='周明'; # 对于依赖多个基础表的视图,不能使用DELETE语句
当视图包含以下任何一种SQL语句结构时,该视图不可更新。
- 聚合函数
- DISTINCT关键字
- CROUP BY子句
- ORDER BY子句
- HAVING子句
- UNION运算符
- 位于选择列表中的子查询
- FROM子句中包含多个数
- SELECT 语句中引用了不可更新视图
- WHERE子句中的子查询,引用FROM子句中的表
7.使用视图需要注意的地方
- 创建视图必须具有足够的访问权限
- 对于可以创建的视图数目没有限制
- 视图可以嵌套
- 视图不能索引,不能有关联的触发器、默认值
- order by子句可以用在视图中。但如果从该视图检索数据的select子句中也具有order by子句,则会被覆盖