1、数据库系统概论 An Introduction to Database System第三章 关系数据库标准语言SQL (4),复习,1.统计每人不及格的门数,2.查询显示开设课程的名称、及格人数及最高分,3.查询显示所有计算机系学生的姓名,以及他们所选课程和相应的成绩。,复习,单表查询,SELECT Sno,count(cno) FROM SC WHERE grade60group by sno,1.统计每人不及格的门数,复习,单表查询,SELECT cno 课程号,Count(sno) 及格人数,Max(grade) 最高分 FROM SC,Course WHERE SC.cno=Co an
2、dgrade=60 group by cno,2.查询显示开设课程的名称、及格人数及最高分,3.显示全部计算机系学生的姓名,以及他们所选课程名和相应的成绩。,复习,连接查询,SELECT FROM WHERE,sname,cname,gradestudent, sc, o=o and student.sno=sc.sno and sdeptCS,复习,连接查询,SELECT *FROM Student,SC,4.描述下列语句的含义。,WHERE Student.Sno = SC.Sno;,Student.Sno,Sname,Ssex, Sage ,Sdept,Cno,Grade,SELECT
3、C1.Cno,C2.Cpno FROM Course C1,Course C2 WHERE C1.Cpno = C2.Cno;,学习目标,了解外连接以及查询实现 掌握不相关子查询(IN、比较运算符、ANY、ALL) 掌握相关子查询(Exists谓词),3.4 查 询,3.4.1 单表查询 3.4.2 连接查询 3.4.3 嵌套查询 3.4.4 集合查询,广义笛卡尔积查询 等值连接(含自然连接)查询 非等值连接查询 自身连接查询 外连接查询 复合条件连接查询。,SQL中连接查询的主要类型,4.外连接,(1)外连接与普通连接的区别 普通连接操作只输出满足连接条件的元组,外连接操作以指定表为连接主体
4、,将主体表中的全部记录输出显示,【例】将每个学生的基本信息与其所选课程信息对应显示。,结果: Student.Sno Sname Ssex Sage Sdept Cno Grade 0215121 李勇 男 20 CS 1 920215121 李勇 男 20 CS 2 850215121 李勇 男 20 CS 3 880215122 刘晨 女 19 IS 2 900215122 刘晨 女 19 IS 3 800215123 王敏 女 18 MA0215125 张立 男 19 IS,示例:外连接,SELECT , FROM 连接类型 JOIN JOIN ON ON ON WHERE , INNE
5、R LEFT RIGHT FULL CROSS,提示:JOIN的顺序和ON连接条件的顺序相反。外连接只能对两个表进行,(2)语法格式,4.外连接,Student,Sc,SELECT student.*,sc.*FROM student LEFT JOIN scON student.sno=sc.sno,RIGHT,FULL,例:查询所有学生的个人信息及选课信息。,4.外连接,4.外连接,SELECT sname,gradeFROM student JOIN sc JOIN courseON o=oON student.sno=sc.snoWHERE cname=数学,例查询选修“数学”课程的学
6、生的姓名和该课程成绩。,查询显示全部计算机系学生的姓名,以及他们所选课程的门数。,练习,SELECT sname,count(cno) 课程门数 FROM student left join sc ON student.sno=sc.sno WHERE sdeptCS GROUP BY Sname,特点:WHERE子句中含多个条件。例35查询选修2号课程且成绩在90分以上所有学生的学号、姓名。SELECT Student.Sno, student.Sname FROM Student, SCWHERE Student.Sno = SC.Sno AND SC.Cno= 2 AND SC.Grad
7、e 90;,5.复合条件连接,特点:连接操作在两个以上的表之间进行例36查询每个学生的学号、姓名、选修的课程名及成绩. SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Course WHERE Student.Sno = SC.Sno and SC.Cno = Course.Cno;,6.多表连接,3.4 查 询,3.4.1 单表查询 3.4.2 连接查询 3.4.3 嵌套查询 3.4.4 集合查询,3.4.3 嵌套查询,嵌套查询概述 嵌套查询分类及求解方法 引出子查询的谓词,(1)一个SELECT-FROM-WHERE语句称为一个查询
8、块 (2)将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语条件中的查询称为嵌套查询。,1.嵌套查询概述,例:SELECT Sname 外层查询/父查询FROM Student WHERE Sno IN(SELECT Sno 内层查询/子查询FROM SC WHERE Cno=2);,嵌套查询概述,(3) 说明: 子查询的限制注意:子查询不能使用ORDER BY子句ORDER BY只对查询最终结果的排序 层层嵌套方式反映了SQL语言的结构化不同的DBMS允许的最大嵌套层数不同 有些嵌套查询可以用连接查询替代,3.4.3 嵌套查询,嵌套查询概述 嵌套查询分类及求解方法 引出子查询的
9、谓词,(1)不相关子查询:子查询的查询条件不依赖于父查询查询过程:由里向外逐层处理每个子查询在上一级查询处理之前先求解;子查询的结果用于建立父查询的查找条件。,2.嵌套查询的分类,(1)不相关子查询:,2.嵌套查询的分类,例:SELECT Sname 外层查询/父查询FROM Student WHERE Sno IN(SELECT Sno 内层查询/子查询FROM SC WHERE Cno=2);,(2)相关子查询:子查询的查询条件依赖于父查询查询过程: 首先取外层查询表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表; 然后再取外层表的
10、下一个元组。重复这一过程,直至外层表全部检查完为止。,嵌套查询的分类,3.4.3 嵌套查询,嵌套查询概述 嵌套查询分类及求解方法 引出子查询的谓词,3.引出子查询的谓词,带有IN谓词的子查询 带有比较运算符的子查询 带有ANY或ALL谓词的子查询 带有EXISTS谓词的子查询,例39 查询与刘晨在同一个系学习的学生。可以分步实现: 确定“刘晨”所在系名SELECT Sdept FROM Student WHERE Sname= 刘晨;,1.带有IN谓词的子查询,结果为:dept IS,例39 查询与刘晨在同一个系学习的学生。 查找所有在IS系学习的学生 SELECT Sno,Sname,Sde
11、pt FROM Student WHERE Sdept= IS ;结果为: Sno Sname Sdept0215122 刘晨 IS0215125 张立 IS,1.带有IN谓词的子查询(续),1.带有IN谓词的子查询(续),方法1:将第一步查询嵌入到第二步查询的条件中SELECT Sno,Sname,SdeptFROM StudentWHERE Sdept IN( SELECT SdeptFROM StudentWHERE Sname= 刘晨 ),构造嵌套查询,说明:此查询为不相关子查询;DBMS求解该查询时也是分步去做的。,方法2:也可用自身连接完成本查询要求S1 S2 SELECT S1.
12、Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2 WHERE S1.Sdept = S2.SdeptAND S2.Sname = 刘晨;,1.带有IN谓词的子查询(续),例38查询选修了课程名为“信息系统”的学生学号和姓名,1.带有IN谓词的子查询(续), 最后在Student关系中取出Sno和SnameSELECT Sno,Sname FROM StudentWHERE Sno IN (),SELECT Cno FROM Course WHERE Cname= 信息系统, 首先在Course关系中找出“信息系统”的课程号,结果:3, 然后在SC
13、关系中找出选修了3号课程的学生学号SELECT Sno FROM SCWHERE Cno IN( ),组合以后的代码:SELECT Sno,SnameFROM StudentWHERE Sno IN(SELECT SnoFROM SCWHERE Cno IN(SELECT CnoFROM Course WHERE Cname= 信息系统);,1.带有IN谓词的子查询(续),结果: Sno Sname0215121 李勇0215122 刘晨,1.带有IN谓词的子查询(续),另:本例也可用连接查询SELECT Sno,Sname FROM Student,SC,Course WHERE Stude
14、nt.Sno = SC.Sno AND SC.Cno = Course.CnoAND Course.Cname=信息系统;,是指父查询和子查询之间用比较运算符连接的查询 适用范围: 当能确切知道内层查询返回单值时; 内层查询返回值是集合,要与ANY或ALL谓词配合使用后。,2.带有比较运算符的子查询,2.带有比较运算符的子查询(续),例:假设一个学生只可能在一个系学习,并且必须属于一个系,则在例37可以改写为 :SELECT Sno,Sname,Sdept FROM Student WHERE Sdept =(SELECT Sdept FROM StudentWHERE Sname= 刘晨 )
15、;注意:(1)子查询一定要用括号括起来,2.带有比较运算符的子查询(续),注意: (2)子查询一定要跟在比较符之后。,SELECT Sno,Sname,Sdept FROM Student WHERE (SELECT Sdept FROM StudentWHERE Sname= 刘晨 ) = Sdept;,谓词语义: ANY:表示任意一个值, ALL:表示所有值,3.带有ANY或ALL谓词子查询,需要配合使用比较运算符: (=)ANY 大于(大于等于)子查询结果中的某个值 (=)ALL 大于(大于等于)子查询结果中的所有值 (= )ANY 小于(小于等于)子查询结果中的某个值 (= )ALL
16、小于(小于等于)子查询结果中的所有值 =ANY 等于子查询结果中的某个值 =ALL 等于子查询结果中的所有值(通常无意义) !=ANY 不等于子查询结果中的某个值 !=ALL 不等于子查询结果中的任何一个值,3.带有ANY或ALL谓词子查询,哪些无实际意义?,例42查询其他系中比信息系任一个(其中某一个)学生年龄小的学生姓名和年龄。SELECT Sname,Sage FROM StudentWHERE Sage ANY (SELECT Sage FROM StudentWHERE Sdept= IS ),执行过程:,3.带有ANY或ALL谓词子查询(续),AND Sdept IS ;,是哪个查
17、询的条件?,ANY和ALL谓词有时可以用集函数实现 ANY、ALL与集函数的对应关系,3.带有ANY或ALL谓词子查询(续),IN,-,MAX,=MAX,MIN,= MIN,-,NOT IN,MIN,= MIN,MAX,= MAX,用ANY实现例39如下: SELECT Sname,Sage FROM StudentWHERE Sage IS ;,3.带有ANY或ALL谓词子查询(续),用集函数实现例39如下: SELECT Sname,Sage FROM StudentWHERE Sage IS ;,例43查询其他系中比IS系所有学生年龄都小的学生姓名及年龄。 方法一:用ALL谓词SELEC
18、T Sname,Sage FROM Student WHERE Sage IS ;,3.带有ANY或ALL谓词子查询(续),例40查询其他系中比IS系所有学生年龄都小的学生姓名及年龄。 方法二:用集函数SELECT Sname,Sage FROM Student WHERE Sage IS ;,3.带有ANY或ALL谓词子查询(续),用聚集函数实现子查询能够减少比较次数,提高查询效率 (CPU) 。,比较两种方法的效率,3.4.3 嵌套查询,带有IN谓词的子查询 带有比较运算符的子查询 带有ANY或ALL谓词的子查询 带有EXISTS谓词的子查询,4.带有EXISTS谓词的子查询,(1) EX
19、ISTS谓词 (2) NOT EXISTS谓词 (3) 不同形式的查询间的替换 (4) 相关子查询的效率 (5) 用EXISTS/NOT EXISTS实现全称量词 (6) 用EXISTS/NOT EXISTS实现逻辑蕴函,4.带有EXISTS谓词的子查询,(1)EXISTS谓词 相当于存在量词 带有EXISTS谓词的子查询不返回具体数据,只产生逻辑值“True”或 “False”。 由EXISTS引出的子查询,其目标列表达式通常都用 * 。 (2) NOT EXISTS谓词,例44查询所有选修了2号课程的学生姓名。,4.带有EXISTS谓词的子查询,用带in谓词的嵌套查询 SELECT Sna
20、me FROM Student WHERE Sno in(SELECT Sno FROM SC WHERE Cno= 2),例44查询所有选修了2号课程的学生姓名。,用带EXISTS谓词的嵌套查询 SELECT Sname FROM Student WHERE EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= 2),4.带有EXISTS谓词的子查询,用带EXISTS谓词的嵌套查询 SELECT Sname FROM Student WHERE EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno
21、AND Cno= 2),4.带有EXISTS谓词的子查询,外,内,带EXISTS谓词查询的执行过程:,内,4.带有EXISTS谓词的子查询,外,内,内,内,内,带EXISTS谓词查询的执行过程:,用带EXISTS谓词的嵌套查询 SELECT Sname FROM Student WHERE EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= 2),4.带有EXISTS谓词的子查询,外,内,内,内,内,内,内,带EXISTS谓词查询的执行过程:,用带EXISTS谓词的嵌套查询 SELECT Sname FROM Student WHERE
22、 EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= 2),用带EXISTS谓词的嵌套查询 SELECT Sname FROM Student WHERE EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= 2),4.带有EXISTS谓词的子查询,带EXISTS谓词查询的执行过程:,外,内,内,内,内,内,内,用带EXISTS谓词的嵌套查询 SELECT Sname FROM Student WHERE EXISTS(SELECT * FROM SC WHERE Sno=Stud
23、ent.Sno AND Cno= 2),4.带有EXISTS谓词的子查询,带EXISTS谓词查询的执行过程:,内,外,例44查询所有选修了2号课程的学生姓名。,4.带有EXISTS谓词的子查询,本查询涉及Student和SC关系。 在Student中依次取每个元组的Sno值,用此值去检查SC关系。 若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= 2,则取此Student.Sname送入结果关系,父查询指针下移,子查询回到首行。 否则,子查询移到底部才返回False值,总结:对每一个父查询的元组,都要求解一遍子查询,例44查询所有选修了2号课程的学生姓名。,4.
24、带有EXISTS谓词的子查询,用ExistsSELECT Sname FROM Student WHERE EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= 2),用IN SELECT Sname FROM Student WHERE Sno in(SELECT Sno FROM SC WHERE Cno= 2),例44查询所有选修了2号课程的学生姓名。,4.带有EXISTS谓词的子查询,用连接查询SELECT Sname FROM Student, SCWHERE Student.Sno=SC.SnoAND SC.Cno= 2;,例
25、45查询没有选修2号课程的学生姓名。SELECT Sname FROM StudentWHERE NOT EXISTS (SELECT * FROM SCWHERE Sno = Student.Sno AND Cno=2);,4.带有EXISTS谓词的子查询,该要求很难用连接查询实现,4.带有EXISTS谓词的子查询,用嵌套查询 SELECT Sname FROM Student WHERE NOT EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= 2),例45查询没有选修2号课程的学生姓名。,4.带有EXISTS谓词的子查询,(3)
26、不同形式的查询间的替换 一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换 所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。,总结:EXISTS谓词的表达能力高于其他谓词的表达形式的。,例37查询与刘晨在同一个系学习的学生,用带EXISTS谓词的子查询替换:SELECT Sno,Sname,Sdept FROM Student S1WHERE EXISTS (SELECT * FROM StudentWHERE Sdept = S1.Sdept AND Sname = 刘晨),4.带有EXISTS谓词的子查询,4.
27、带有EXISTS谓词的子查询,(4)相关子查询的效率 由于带EXISTS谓词的相关子查询只关心内层查询是否有返回值,并不需要查具体值,因此其效率并不一定低于其他查询。,4.带有EXISTS谓词的子查询,(5)用EXISTS/NOT EXISTS实现全称量词(难点) SQL语言中没有全称量词 (For all) 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:(x)P (x(P),例43查询选修了全部课程的学生姓名。SELECT Sname FROM Student WHERE NOT EXISTS(SELECT * FROM Course WHERE NOT EXISTS(SELECT
28、 * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno));,4.带有EXISTS谓词的子查询,4.带有EXISTS谓词的子查询,Student,Sc,外,中,内,SELECT Sname FROM Student WHERE NOT EXISTS(SELECT * FROM Course WHERE NOT EXISTS(SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno) ),SELECT Sname FROM Student WHERE NOT EXISTS(SELEC
29、T * FROM Course WHERE NOT EXISTS(SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno) ),4.带有EXISTS谓词的子查询,Student,Sc,外,中,内,内,SELECT Sname FROM Student WHERE NOT EXISTS(SELECT * FROM Course WHERE NOT EXISTS(SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno) ),4.带有EXISTS谓词的子查询,Student
30、,Sc,外,中,内,内,内,内,内,内,SELECT Sname FROM Student WHERE NOT EXISTS(SELECT * FROM Course WHERE NOT EXISTS(SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno) ),4.带有EXISTS谓词的子查询,Student,Sc,外,中,内,内,内,SELECT Sname FROM Student WHERE NOT EXISTS(SELECT * FROM Course WHERE NOT EXISTS(SELECT * FROM SC
31、WHERE Sno= Student.Sno AND Cno= Course.Cno) ),4.带有EXISTS谓词的子查询,Student,Sc,外,中,内,内,内,内,SELECT Sname FROM Student WHERE NOT EXISTS(SELECT * FROM Course WHERE NOT EXISTS(SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno) ),4.带有EXISTS谓词的子查询,Student,Sc,外,中,内,内,内,内,内,SELECT Sname FROM Student WH
32、ERE NOT EXISTS(SELECT * FROM Course WHERE NOT EXISTS(SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno) ),4.带有EXISTS谓词的子查询,Student,Sc,外,中,内,内,内,内,内,例:查询选修了课程的学生姓名 方法一: Select sname From student Where Exists (Select * From scWhere student.sno=sc.sno),方法二:Select DISTINCT sname From student ,
33、scWhere student.sno=sc.sno,方法三:Select sname From studentWhere sno in(select distinct sno from sc),请比较:本例中三种方法的查询效率如何?,3.4 查 询,3.4.1 单表查询 3.4.2 连接查询 3.4.3 嵌套查询 3.4.4 集合查询,3.4.4 集合查询,标准SQL直接支持的集合操作种类 并操作(UNION) 一般商用数据库支持的集合操作种类 并操作(UNION) 交操作(INTERSECT) 差操作(EXCEPT),3.4.4 集合查询,1.并操作(UNION):参加UNION操作的各结
34、果表的列数必须相同;对应项的数据类型也必须相同。一般格式为: UNION,例48查询计算机系的学生及年龄不大于19岁的学生。 方法一:SELECT * FROM Student WHERE Sdept= CSUNIONSELECT * FROM Student WHERE Sage=19;,3.4.4 集合查询,方法二: SELECT DISTINCT * FROM Student WHERE Sdept= CS OR Sage=19;,例49查询选修了课程1或者选修了课程2的学生。 方法一:SELECT Sno FROM SC WHERE Cno= 1 UNIONSELECT Sno FRO
35、M SC WHERE Cno= 2 ;,3.4.4 集合查询,结果有几条记录?,方法二:SELECT DISTINCT Sno FROM SCWHERE Cno= 1 OR Cno= 2 ;,补充设数据库中有教师表Teacher(Tno,Tname,)查询学校中所有师生的姓名。SELECT Sname FROM StudentUNIONSELECT Tname FROM Teacher;,3.4.4 集合查询,还能用前面类似的等价方式表示吗?,2.交操作(INTERSECT):标准SQL没有提供交操作,但SQL SERVER 2008提供。例50查询计算机系的学生与年龄不大于19岁的学生的交集
36、。SELECT * FROM Student WHERE Sdept = CS AND Sage=19;SELECT * FROM Student WHERE Sdept = CS INTERSECTSELECT * FROM Student WHERE Sage=19;,3.4.4 集合查询,例51查询既选修1号课又选修2号课的学生集合,3.4.4 集合查询,SELECT Sno FROM SC WHERE Cno= 1 AND Sno IN(SELECT Sno FROM SC WHERE Cno= 2 );,思考:查询教师和学生同名的集合。,SELECT Sno FROM SC WHER
37、E Cno= 1 INTERSECT SELECT Sno FROM SC WHERE Cno= 2 ,3.差操作(EXCEPT):标准SQL中没有提供差操作,但SQL SERVER 2008提供了此操作。,3.4.4 集合查询,例52查询计算机科学系的学生与年龄不大于19岁的学生的差集。,3.4.4 集合查询,SELECT * FROM Student WHERE Sdept = CS EXCEPT SELECT * FROM Student WHERE Sage=19;,SELECT * FROM Student WHERE Sdept= CS AND Sage19;,例53查询学生和教师
38、不重名的学生姓名。,3.4.4 集合查询,SELECT Sname FROM Student EXCEPT SELECT Tname FROM Teacher,SELECT sname FROM Student WHERE sname not in (select sname from teacher),3.4.4 集合查询,SELECT * FROM Student ORDER BY SnoUNIONSELECT * FROM Teacher ORDER BY Tno;,new,SELECT Sname FROM Student UNIONSELECT Tname FROM Teacher
39、ORDER BY Tname;,4.对集合操作结果的排序,4.对集合操作结果的排序ORDER BY子句通常用数字序号指定排序属性; 只用于对最终查询结果排序,不能对中间结果排序 任何情况下,ORDER BY子句只能出现在最后。,new,3.4.4 集合查询,SELECT Sname FROM Student UNIONSELECT Tname FROM Teacher ORDER BY Sname,1,SELECT语句的一般格式:SELECT ALL|DISTINCT 别名 FROM 别名 , 别名 WHERE GROUP BY HAVING ORDER BY ASC|DESC ,3.4 查询
40、小结,3.5 数据更新,3.5.1 插入数据 3.5.2 修改数据 3.5.3 删除数据,3.5.1 插入数据,两种插入数据方式:插入单个元组插入子查询结果,3.5.1 插入数据,1.插入单个元组语句格式:INSERT INTO (,)VALUES ( , )功能:将新元组插入指定表中。,3.5.1 插入数据,INTO子句 指定要插入数据的表名及属性列 属性列顺序与表定义中的顺序可以不一致 省略属性列表:表示插入一条完整元组,且属性列属性与表定义顺序一致 指定部分属性列:插入的元组在其余属性列上取空值【省略属性时要注意!】,VALUES子句提供的值必须与INTO子句中的属性匹配 值的个数、类型
41、,3.5.1 插入数据,注意!DBMS在执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则 实体完整性 参照完整性 用户定义的完整性对于有NOT NULL约束对于有UNIQUE约束对于有值域约束,例1将一个新学生记录插入到Student表中,内容如下:(95020,陈冬,男,IS,18岁)INSERT INTO Student VALUES (0215128,陈冬,男,IS,18),3.5.1 插入数据,例2 向SC表插入一条选课记录( 0215128, 1)INSERT INTO SC(Sno,Cno) VALUES ( 0215128 , 1 );新插入的记录在Grade列上取空值
42、。,3.5.1 插入数据,2.插入子查询结果 语句格式INSERT INTO ( , )子查询; 功能:将子查询结果插入指定表中。,3.5.1 插入数据,例3对每一个系,求学生的平均年龄,并把结果存入数据库。首先建表: CREATE TABLE Dept_avgage( Sdept CHAR(15), /*定义系名*/Avgage SMALLINT /*定义平均年龄*/);,3.5.1 插入数据,例3 对每一个系,求学生的平均年龄,并把结果存入数据库。 插入数据:INSERTINTO Dept_avgage(Sdept,Avgage)( SELECT Sdept,AVG(Sage)FROM S
43、tudentGROUP BY Sdept),3.5.1 插入数据,3.5 数据更新,3.5.1 插入数据 3.4.2 修改数据 3.5.3 删除数据,3.5.2 修改数据,语句格式UPDATE SET = ,=WHERE ; 功能修改指定表中满足WHERE子句条件的元组,三种修改方式 修改某一个元组的值 修改多个元组的值 修改子查询的结果,1.修改某一个元组的值例4 将学生95001的年龄改为22岁。UPDATE Student SET Sage=22 WHERE Sno=95001;其中:SET子句: 指定修改方式、列名和修改后的值WHERE子句: 指定要修改的元组;缺省表示修改表中所有元组
44、.,3.5.2 修改数据,2. 修改多个元组的值例5 将所有学生的年龄增加1岁。UPDATE Student SET Sage= Sage+1;将信息系所有学生的年龄增加1岁。UPDATE Student SET Sage= Sage+1 WHERE Sdept= IS ;,3.5.2 修改数据,3.修改子查询的结果例7 将计算机系全体学生的成绩置零。 UPDATE SC SET Grade=0 WHERE Sno IN (SELECT Sno FROM Student WHERE Sdept=cs),3.5.2 修改数据,3.修改子查询的结果例7 将计算机系全体学生的成绩置零。UPDATE
45、SC SET Grade=0 WHERE CS= (SELECT Sdept FROM Student WHERE Student.Sno = SC.Sno);,3.5.2 修改数据,提示:修改数据DBMS也会自动检查三类完整性规则。,3.5 数据更新,3.5.1 插入数据 3.5.2 修改数据 3.5.3 删除数据,3.5.3 删除数据,格式:DELETE FROM WHERE ; 功能 删除指定表中满足WHERE子句条件的元组 WHERE子句 指定要删除的元组 缺省表示要删除表中的所有元组,得到空关系,3.5.3 删除数据,三种删除方式删除某一个元组删除多个元组带子查询的删除语句,1.删除
46、某一个元组的值例7 删除学号为95019的学生记录。DELETE FROM Student WHERE Sno=95019;,3.5.3 删除数据,3.5.3 删除数据,2.删除多个元组的值 例8 删除2号课程的所有选课记录。DELETE FROM SCWHERE Cno=2;删除所有的学生选课记录。DELETE FROM SC;,3. 带子查询的删除例9 删除计算机系所有学生的选课记录。DELETE FROM SC WHERE CS=(SELECT Sdept FROM Student WHERE Student.Sno=SC.Sno);,3.5.3 删除数据,提示:删除数据DBMS自动检查数据库的参照完整性。 拒绝删除 级联删除,小结,EXISTS子查询 SQL的数据更新 插入 修改 删除,作业,P127第4、5、7、9、11题。,下课了。,休息。,追 求,