1、第七章 视图,王军锋,7.1 视图概述,视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表 视图所对应的数据并不真正地存储在视图中,而是存储在所引用的数据表中 视图的结构和数据是对数据表进行查询的结果。,7.1 视图概述-内容,基本表的行和列的子集 两个或多个基本表的联合 基本表的统计和汇总 另一个视图的子集 视图和基本表的混合,7.1 视图概述-视图优点,隐藏了数据的复杂性 在基本表发生更改或重新组合的情况下,用户仍能通过视图或得一致或非变化的数据。提供了一定的数据独立性,相对应于外模式 控制用户提取数据 不必要的数据或敏感数据可以不出现在视图中 简化数据库用户管理 保护数据库基
2、本表 改进性能,7.1 视图概述-视图分类,标准视图 索引视图:在视图上建立索引 分区视图:服务器间的分区数据视图,7.2 创建视图,使用T-SQL 使用SSMS 使用模板,7.2.1 使用T-SQL语句创建视图,Create view ,nwith Encryptionaswith check optionwith Encryption :对视图文本进行加密 with check option:强制针对视图执行的所有数据修改语句都必须符合查询中设置的条件,例7-1:创建计算机学院的学生视图,Create view V_stu_computerasselect * from 学生表 where
3、 院系名称=计算机学院 创建完视图之后,可以象查找表一样查找视图 Select * from v_stu_computer,例7-2:使用with check option创建视图,Create view v_stu_lang as select 学号,姓名,出生日期,政治面貌,院系名称 from 学生表 where 院系名称 = 外语学院with check optionselect * from v_stu_lang 因为指定了with check option,因此下面语句会提示出错 update v_stu_lang set 院系名称= 测试 where 学号=10019,例7-3:多
4、表视图,Create view v_grade(学生,课程,老师,分数)Asselect b.姓名,c.课程名,d.姓名 as 教师,分数from 成绩表 a join 学生表 b on a.学号=b.学号join 课程表 c on a.课程号=c.课程号join 教师表 d on a.教师编号=d.教师编号 select * from v_grade,例7-4: 基于视图的视图,create view v_grade_computer asselect 学生,课程,老师,分数 from v_grade a join 学生表 b on a.学生=b.姓名 and b.院系名称=计算机学院v_g
5、rade_computer是基于v_grade 和学生表建立视图 select * from v_grade_computer,例7-4:带虚列的视图,create view v_stu(学号,姓名,年龄) asselect 学号,姓名,DATEDIFF(YY,出生日期,GETDATE() from 学生表 Goselect * from v_stu,使用系统存储过程查看视图,sp_help v_grade_computersp_depends v_grade_computersp_helptext v_grade_computer,例7-5: 加密视图,Create view v_stucw
6、ith encryptionasselect 院系名称,count(学号) as 人数 from 学生表 group by 院系名称goselect * from v_stuc 在ssms下查看视图,比较其图标和其他视图的不同,7.2.2 使用SSMS创建视图,对象资源管理器上选择具体数据库下的视图节点,右击,选择“新建视图”,7.2.3 使用模板创建视图,和使用模板创建表类似,7.3 管理视图,修改视图 Alter view,n As从格式上来看,就是把create变成alter了,修改视图,alter view v_stucwith encryptionasselect 出生地,count
7、(学号) as 人数 from 学生表 group by 出生地go,删除视图 Drop view 重命名视图 Sp_rename,7.4 使用视图修改基本表的数据,如果视图是基于几张表创建,那么通过视图修改基本表时,一次只能修改一张表 视图只能修改参与视图定义的表和列 只能是基本列,不能是计算列 通过视图修改的列不能出现在视图定义时的select语句中的group by 和having中,7.4 使用视图修改基本表的数据,成功 update v_grade set 分数=60where 学生=吴永成 and 课程=排球 失败,因为修改涉及到多个表 update v_grade set 分数=
8、60,老师=张晓晨where 学生=吴永成 and 课程=排球,失败,年龄是派生列 update v_stu set 年龄= 27 where 学号=10000失败 update v_stuc set 院系名称=人文学院 where 人数=6,7.5 使用视图解决复杂查询问题,用视图作为中间环节,有时候一条查询语句无法解决问题,可借用视图帮助。 查询每家银行给国营企业贷款占总贷款比例create view v1 asselect bno,SUM(lamount) sum1from legalentityT le join loant l on le.eno=l.enowhere enature
9、 = 国营group by bno gocreate view v2 asselect bno,SUM(lamount) sum2from legalentityT le join loant l on le.eno=l.enogroup by bno goselect v1.bno,CAST(sum1*1.0/sum2 as decimal(3,2) from v1 join v2 on v1.bno=v2.bno,7.5 使用视图解决复杂查询问题,统计每个法人在每家银行的还款比例create view v_interest asselect le.eno,b.bno,repayment=l
10、amount+lamount*case when ename like 工商银行% and (lterm between 1 and 5) then 0.02when ename like 工商银行% and (lterm between 6 and 10) then 0.03when ename like 工商银行% and (lterm 10) then 0.04when ename not like 工商银行% and (lterm between 1 and 5) then 0.03when ename not like 工商银行% and (lterm between 6 and 1
11、0) then 0.04when ename not like 工商银行% and (lterm 10) then 0.05endfrom LegalEntityT le join LoanT L on le.Eno=l.Enojoin BankT b on l.bno=b.bnoselect eno,bno,SUM(repayment) from v_interest group by eno,bno,要求,掌握视图的作用和优点 熟练掌握定义视图的SQL语句 熟练掌握通过视图机制实现复杂的数据操作功能的方法,作业,1. 视图和数据表之间的主要区别是什么? 2使用视图的优点有哪些? 3 如何通过SSMS和Transact-SQL语句对视图进行创建、修改和删除? 4. 使用哪些存储过程可以查看视图的信息?,作业,5.创建一个包含体育学院学生信息的视图 V_体育,然后使用系统存储过程将该视图的名称修改为v_体育学院, 6.在SSMS中,使用鼠标操作和使用SQL语句两种方式实现以下操作:向此视图中插入新数据,修改刚插入的数据,删除插入的数据,查看视图中的数据。 7.使用DROP VIEW命令删除上题中的视图。,