视图的使用主要包括视图的检索,以及通过视图对基表进行插入、修改、删除操作。视图的检索几乎没有什么限制,但是对通过视图实现表的插入、修改、删除操作则有一定的限制条件。
使用视图进行查询实际上就是把视图作为数据源,实现查询功能。
例如:通过视图stu_view2,查询选修课程号为c08123、且成绩在80分以上的18级男生学生的学号、课程号和成绩。
mysql> select 学号, 姓名,课程号,成绩
-> from stu_view2
-> where 课程号='c08123' and 成绩 > 80;
创建视图course_avg,统计各门课程平均成绩,并按课程名称降序排列。
mysql> create view course_avg
-> as select cname 课程名, avg(final) 平均成绩
-> from score join course on score.courseno= course.courseno
-> group by cname desc;
mysql> select * from course_avg;
使用视图修改表数据,是指在视图中进行insert
、update
和delete
等操作而修改基表的数据。通过视图修改表数据时,要有执行相关操作的权限。
如:通过视图teach_view1,对基表teacher进行插入、更新和删除数据的操作。
代码和运行结果如下:
mysql> insert into teach_view1(teacherno,tname,major,prof,department)
-> values (‘t06027’ , ‘陶期年’ , ‘纳米技术’ , ‘教授’ , ‘材料学院’ );
mysql> update teach_view1 set prof = ‘副教授’ where teacherno = ‘t07019’;
mysql> delete from teach_view1 where teacherno = ‘t08017’;
使用select
语句查询teacher表,可以看到基表中的数据也相应地进行了修改。
mysql> select * from teacher ;
视图stu_score1依赖于源表student、course和score等3张表,包括studentno、sname、 phone、cname和final等5个字段,通过stu_score1修改基本表student中的学号为18125121107的电话号码。
mysql> update stu_score1 set phone='132123456777'
-> where studentno =‘18125121107’;
mysql> select studentno,sname, phone from student
-> where studentno ='18125121107' ;
说明:
(1)视图若只依赖于一个基表,则可以直接通过更新视图来更新基本表的数据。
(2)若一个视图依赖于多张基表,则一次只能修改一个基表的数据,不能同时修改多个基本表的数据。
(3)如果视图包含下述结构中的任何一种,都是不可修改的:
①视图的列含有聚合函数(avg、count、sum、min、max)。
②视图的列是通过表达式并使用列计算出其他列。
③含有distinct关键字。
④含有group by子句、order by子句、having子句。
⑤含有union运算符。
⑥视图的列位于选择列表中的子查询。
⑦from子句中包含多个表。
⑧select语句中引用了不可更新视图。
⑨where子句中的子查询,引用from子句中的表。
在MySQL数据库中,视图可分为普通视图与检查视图。前面介绍的视图都没有使用with check option子句,当没有with_check_option时,表示with_check_option的值为0。即为普通视图,普通视图不具备检查功能。
如果使用了with check option
子句,在通过检查视图更新基表数据时,只有满足检查条件的更新语句才能成功执行。
例子:编程在teaching数据库中创建一个名称为V_ dept的视图,包含所有部门为“计算机学院”的老师的数据信息,需限制插入数据中部门必须为“计算机学院”。
分析:该程序通过单表生成的视图V_dept向基表teacher中插入一条记录,并通过查询语句显示基表中的所有数据。
在“查询编辑器”中输入以下程序,创建V_dept视图。
mysql> create view V_dept
-> AS
-> select teacherno,tname,major,prof, department
-> from teacher
-> where department ='计算机学院'
-> with check option;
mysql> insert into V_dept
-> values(‘t08017’,‘时观’,‘金融管理’,‘副教授’,‘计算机学院’);
mysql> select * from teacher where tname='时观';
本例由于创建了with check option
检查条件约束,当插入记录时所有“部门”信息不符合条件的记录无法插入和修改,并显示错误提示信息。
通过视图V_sex向基表teacher中插入数据行(‘t08037’,‘时刻’,‘软件技术’,‘讲师’,‘软件学院’)。
mysql> insert into V_dept
-> values('t08037','时刻','软件技术','讲师','软件学院');
执行结果表明,通过检查更新表数据时,检查视图对更新数据进行了先行检查,若更新语句的数据不满足检查条件,则检查视图就会抛出异常,更新失败。