第十一讲§3.5数据更新§3.6视图3.5.1插入数据插入数据是指把新的记录插入到一个已存在的表中,使用语句INSERTINTO,可分为以下几种情况。1)插入一个元组语法格式为:INSERTINTO表名[(列名1[,列名2…])]VALUES(常量1[,常量2…])3.5数据更新SQL语言的数据操纵语句DML主要包括插入数据、修改数据和删除数据三种语句:[例1]在Student表中插入一条学生记录(学号:05010;姓名:郑冬;性别:女;年龄:21;系别:CS)。INSERTINTOStudent(Sno,Sname,Ssex,Sage,Sdept)VALUES(‘05010’,‘郑冬’,‘女’,21,‘CS’)或者:INSERTINTOStudentVALUES(‘95010’,‘郑冬’,‘女’,21,‘CS’)注意1:•当新增元组指明了每个列值,且和表中属性列的排列顺序一致,则INTO子句中的列名可省略。INSERTINTOSC(SNO,CNO)VALUES(‘05010',‘3')[例2]在SC表中插入一条选课记录(’05010’,’3’)注意2:•对于INTO子句中没有出现的属性列,则新元组在这些列上将取空值。(见P115)思考:其他写法2)插入多个元组[例3]对每一个系求学生的平均年龄,并把结果存入数据库;假设当前有一空表Deptage(Sdept,Avgage)。INSERTINTODeptageSELECTSdept,AVG(Sage)FROMStudentGROUPBYSdept语法格式为:INSERTINTO表名[(列名1,…)]子查询用于生成要插入的批量数据3.5.2修改数据•SQL使用UPDATE语句对表中的一行或多行记录的某些列值进行修改,其语法格式为:UPDATE表名SET列名=表达式[,列名=表达式]…[WHERE条件]其中:•表名是指要修改的表;•SET子句给出要修改的列及其修改后的值;•WHERE子句指定要修改的元组应当满足的条件,WHERE子句省略时,则修改表中的所有元组。考虑:在日常应用中,执行修改数据操作的实例有哪些?[例4]修改学号为05003的学生姓名为王小敏,年龄为23。[例5]将所有学生年龄增加1岁。[例6]将所有数学系学生的3号课成绩全部清零。UPDATEStudentSETSname=‘王小敏’,Sage=23WHERESno=’05003’UPDATEStudentSETsage=sage+1UPDATESCSETGrade=0WHERECno=‘3’andSnoIN(SELECTSnoFROMstudentWHERESdept=‘MA’)3.5.3删除数据使用DELETE语句可以删除表中的一行或多行记录,其语法格式为:DELETEFROM表名[WHERE条件]其中,表名是指要删除元组的表。WHERE子句指定待删除的记录应当满足的条件;WHERE子句省略时,则删除表中的所有记录。考虑:日常应用中,删除数据的实例有哪些?[例7]删除学号为‘05002’的学生。[例8]删除所有课程信息DELETEFROMStudentWHERESno=‘05002’DELETEFROMCourse注意:执行此语句后,Course表即为一个空表,但其定义仍存在数据字典中。综合练习1:•图书馆DBperson(pno,pname,dept)book(bno,bname,class,author,pub,price)loan(pno,bno,btime,rtime)1)删除‘MA’系的所有借书记录;2)将‘李平’的还书时间均置为空值;3)将(‘11012’,’王敏’,‘IS’)插入person;4)表TJXX(dept,num)中保存着每个系未还书的总数:删除TJXX中的所有记录;将当前每个系未还书的统计情况保存到该表中;综合练习2:•salesperson(sname,age,salary)•orders(cname,sname,amount)•custormer(cname,city,type)1)向salesperson中插入30岁Jack的记录,薪水未知;2)向新表high(sname,age)插入记录,这个表中的销售人员的薪水至少是100000;3)删除客户ABERCONSTRUCTION的所有订单记录;4)将所有的销售员的工资加10%;视图的特点:虚表,是从一个或几个基本表(或视图)导出的表;只存放视图的定义,不存放视图对应的数据;基表中的数据发生变化,从视图中查询出的数据也随之改变;视图一经定义,可以和基本表一样被查询。但对视图的更新操作则有一定的限制。3.6视图3.6.1定义视图1建立视图语句格式CREATEVIEW视图名[(列名[,列名]…)]AS子查询子查询可以是任意复杂的SELECT语句,但通常不允许含ORDERBY子句。DBMS执行CREATEVIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句;在对视图查询时,按视图的定义从基本表中将数据查出。或者全部省略或者全部指定[例1]建立信息系学生的视图,显示学号,姓名和年龄。CREATEVIEWIS_StudentASSELECTSno,Sname,SageFROMStudentWHERESdept='IS';①行列子集视图:从单个基本表导出,只去掉了基本表的某些行和某些列。[例2]建立信息系选修了1号课程的学生视图,显示学号,姓名和分数。CREATEVIEWIS_S1(Sno,Sname,Grade)ASSELECTStudent.Sno,Sname,GradeFROMStudent,SCWHERESdept='IS'ANDCno='1'ANDStudent.Sno=SC.Sno;②建立在多表上的视图注:多表连接时选出了同名列作为视图的字段,必须明确定义组成视图的各个属性列名[例3]建立信息系选修了1号课程且成绩在90分以上的学生的视图。显示学号,姓名和分数。CREATEVIEWIS_S2ASSELECTSno,Sname,GradeFROMIS_S1WHEREGrade=90;③建立在视图上的视图[例4]定义一个反映学生出生年份的视图。显示学号,姓名和出生年份。CREATEVIEWview_birth(Sno,Sname,Sbirth)ASSELECTSno,Sname,2012-SageFROMStudent注:带表达式的视图必须明确定义组成视图的各个属性列名.④带表达式的视图[例5]将学生的学号及他的平均成绩定义为一个视图CREATVIEWview_avggrade(Sno,Gavg)ASSELECTSno,AVG(Grade)FROMSCGROUPBYSno;⑤分组视图2.删除视图DROPVIEW视图名;该语句从数据字典中删除指定的视图定义;由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删除;删除基本表时,由该基表导出的所有视图定义都必须显式删除;3.6.2查询视图(1)视图定义后,用户可以像对基本表一样对视图进行查询。[例6]在信息系学生的视图中找出年龄小于20岁的学生学号和年龄。SELECTSno,SageFROMIS_StudentWHERESage20;IS_Student视图的定义(视图定义例1):CREATEVIEWIS_StudentASSELECTSno,Sname,SageFROMStudentWHERESdept='IS';视图消解转换后的查询语句为:SELECTSno,SageFROMStudentWHERESdept='IS'ANDSage20;[例7]查询信息系选修了1号课程的学生SELECTIS_Student.Sno,SnameFROMIS_Student,SCWHEREIS_Student.Sno=SC.SnoANDSC.Cno='1';3.6.2查询视图(2)3.6.3更新视图用户角度:更新视图与更新基本表相同对视图的更新,最终转换为对基本表的更新[例8]将信息系学生视图IS_Student中学号为95002的学生姓名改为“刘辰”。UPDATEIS_StudentSETSname='刘辰'WHERESno='95002';转换后的更新语句:UPDATEStudentSETSname='刘辰'WHERESno='95002'ANDSdept='IS';[例9]向信息系学生视图IS_S中插入一个新的学生记录:95029,赵新,20岁INSERTINTOIS_StudentVALUES(‘95029’,‘赵新’,20);转换为对基本表的更新:INSERTINTOStudent(Sno,Sname,Sage,Sdept)VALUES('95029','赵新',20,'IS');[例10]删除视图IS_Student中学号为95029的记录DELETEFROMIS_StudentWHERESno='95029';转换为对基本表的更新:DELETEFROMStudentWHERESno='95029'ANDSdept='IS';更新视图的限制一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新例:视图S_GCREATEVIEWS_G(Sno,Gavg)ASSELECTSno,AVG(Grade)FROMSCGROUPBYSno;注:目前各关系DBMS一般只允许对行列子集视图进行更新。3.6.4视图的作用1.视图能够简化用户的操作2.视图能够对机密数据提供安全保护3.视图对重构数据库提供了一定程度的逻辑独立性4.利用视图可以更清晰地表达查询例:查询每个同学获得最高成绩的课号。考虑1:直接利用sc表构造复杂的查询;考虑2:先建立一个视图,求得每人的最高成绩;再基于视图和sc表进行查询。作业:P127T58)~11)T8、T11