Transact-SQL第10章.ppt_第1页
Transact-SQL第10章.ppt_第2页
Transact-SQL第10章.ppt_第3页
Transact-SQL第10章.ppt_第4页
Transact-SQL第10章.ppt_第5页
已阅读5页,还剩152页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第9章Transact-SQL,2,SQL的特点,1.综合统一2.高度非过程化3.面向集合的操作方式4.以同一种语法结构提供两种使用方法5.语言简洁,易学易用,3,语言简捷,易学易用,4,SELECT语句是掌握SQL语言的关键在创建视图、插入数据(大部分)均需查询语句。,5,单表查询连接查询嵌套查询集合查询,9.2.4数据查询,6,SELECT语句的语法格式为:语句格式SELECTALL|DISTINCT,INTO新表名FROM,WHEREGROUPBYHAVINGORDERBYASC|DESC,SELECT语句概述,7,语句格式,SELECT子句:指定要显示的属性列FROM子句:指定查询对象(基本表或视图)WHERE子句:指定查询条件GROUPBY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。HAVING短语:筛选出只有满足指定条件的组ORDERBY子句:对查询结果表按指定列值的升序或降序排序,8,注意把SELECT语句和关系代数表达式联系起来考虑问题SELECT-FROM-WHERE句型A1An(F(R1R2Rn)SELECTA1,AnFROMR1,R2,RnWHEREF,9,示例数据库,Xjgl(学籍管理)数据库学生表:Student(Sno,Sname,Ssex,Sage,Sdept)课程表:Course(Cno,Cname,Cpno,Ccredit)学生选课表:SC(Sno,Cno,Grade),10,单表查询,查询仅涉及一个表,是一种最简单的查询操作一、选择表中的若干列(投影查询)二、选择表中的若干元组(选择查询)三、对查询结果排序(排序查询)四、使用集函数五、对查询结果分组,11,1、查询指定列,例1查询全体学生的学号与姓名。SELECTSno,SnameFROMStudent例2查询全体学生的姓名、学号、所在系。SELECTSname,Sno,SdeptFROMStudent,一、选择表中的若干列,验证,12,2、查询全部列,例3查询全体学生的详细记录。SELECTSno,Sname,Ssex,Sage,SdeptFROMStudent或SELECT*FROMStudent,13,3、查询经过计算的值,SELECT子句的为表达式算术表达式字符串常量函数列别名等,14,3.查询经过计算的值(续),例4查全体学生的姓名及其出生年份。SELECTSname,2000-SageFROMStudent输出结果:Sname无列名-李勇1976刘晨1977王名1978张立1978,15,3.查询经过计算的值(续),例5查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。SELECTSname,YearofBirth:,2000-Sage,LOWER(Sdept)FROMStudent,验证,16,例题(续),输出结果:Sname无列名无列名无列名-李勇YearofBirth:1976cs刘晨YearofBirth:1977is王名YearofBirth:1978ma张立YearofBirth:1977is,17,例6使用列别名改变查询结果的列标题,SELECTSnameNAME,YearofBirth:BIRTH,2000-SageBIRTHDAY,LOWER(Sdept)DEPARTMENTFROMStudent或SELECTSnameasNAME,YearofBirth:asBIRTH,2000-SageasBIRTHDAY,LOWER(Sdept)asDEPARTMENTFROMStudent输出结果:NAMEBIRTHBIRTHDAYDEPARTMENT-李勇YearofBirth:1976cs刘晨YearofBirth:1977is王名YearofBirth:1978ma张立YearofBirth:1977is,18,二、选择表中的若干元组,消除取值重复的行查询满足条件的元组,19,1.消除取值重复的行,在SELECT子句中使用DISTINCT短语假设SC表中有下列数据SnoCnoGrade-9500119295001285950013889500229095002380,20,ALL与DISTINCT,例7查询选修了课程的学生学号。(1)SELECTSnoFROMSC或(默认ALL)SELECTALLSnoFROMSC结果:Sno-9500195001950019500295002,21,例题(续),(2)SELECTDISTINCTSnoFROMSC结果:Sno-9500195002,验证,22,例题(续),注意DISTINCT短语的作用范围是所有目标列例:查询选修课程的各种成绩错误的写法SELECTDISTINCTCno,DISTINCTGradeFROMSC正确的写法SELECTDISTINCTCno,GradeFROMSC,23,2.查询满足条件的元组,WHERE子句常用的查询条件,24,(1)比较大小,在WHERE子句的中使用比较运算符=,=,!,!=20,25,(2)确定范围,使用谓词BETWEENANDNOTBETWEENAND例9查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。SELECTSname,Sdept,SageFROMStudentWHERESageBETWEEN20AND23,26,例题(续),例10查询年龄不在2023岁之间的学生姓名、系别和年龄。SELECTSname,Sdept,SageFROMStudentWHERESageNOTBETWEEN20AND23,验证,27,(3)确定集合,使用谓词IN,NOTIN:用逗号分隔的一组取值例11查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。SELECTSname,SsexFROMStudentWHERESdeptIN(IS,MA,CS),28,(3)确定集合,例12查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。SELECTSname,SsexFROMStudentWHERESdeptNOTIN(IS,MA,CS),验证,29,(4)字符串匹配,NOTLIKEESCAPE:指定匹配模板匹配模板:固定字符串或含通配符的字符串当匹配模板为固定字符串时,可以用=运算符取代LIKE谓词用!=或运算符取代NOTLIKE谓词,30,通配符,%(百分号)代表任意长度(长度可以为0)的字符串例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab等都满足该匹配串例:SELECTSnameFROMStudentWHERESnameLIKEA%T_(下横线)代表任意单个字符例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串例:SELECTSnameFROMStudentWHERESnameLIKEA_B,Sqlserver中通配符,31,ESCAPE短语:,当用户要查询的字符串本身就含有%或_时,要使用ESCAPE短语对通配符进行转义。,32,1)匹配模板为固定字符串,例14查询学号为04010001的学生的详细情况。SELECT*FROMStudentWHERESnoLIKE04010001等价于:SELECT*FROMStudentWHERESno=04010001,33,2)匹配模板为含通配符的字符串,例15查询所有姓张的学生的姓名、学号和性别。SELECTSname,Sno,SsexFROMStudentWHERESnameLIKE张%,验证,34,匹配模板为含通配符的字符串(续),例16查询姓欧阳且全名为三个字的学生的姓名。SELECTSnameFROMStudentWHERESnameLIKE欧阳_,35,匹配模板为含通配符的字符串(续),例17查询名字中第2个字为阳字的学生的姓名和学号。SELECTSname,SnoFROMStudentWHERESnameLIKE_阳%,36,匹配模板为含通配符的字符串(续),例18查询所有不姓张的学生姓名。SELECTSname,Sno,SsexFROMStudentWHERESnameNOTLIKE张%,37,3)使用换码字符将通配符转义为普通字符,例19查询DB_Design课程的课程号和学分。SELECTCno,Cname,CCRIDEFROMCourseWHERECnameLIKEDB_DesignESCAPE,验证,38,使用换码字符将通配符转义为普通字符(续),例20查询以DB_开头,且倒数第3个字符为i的课程的详细情况。SELECT*FROMCourseWHERECnameLIKEDB_%i_ESCAPE,39,(5)涉及空值的查询,使用谓词ISNULL或ISNOTNULL“ISNULL”不能用“=NULL”代替例21某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。SELECTSno,CnoFROMSCWHEREGradeISNULL,40,例题(续),例22查所有有成绩的学生学号和课程号。SELECTSno,CnoFROMSCWHEREGradeISNOTNULL,41,(6)多重条件查询,用逻辑运算符AND和OR来联结多个查询条件AND的优先级高于OR可以用括号改变优先级可用来实现多种其他谓词NOTINNOTBETWEENAND,42,例题,例23查询计算机系年龄在20岁以下的学生姓名。SELECTSnameFROMStudentWHERESdept=CSANDSage=20ANDSage3注:GROUPBY子句按SNO的值分组,所有具有相同SNO的元组为一组,对每一组使用函数COUNT进行计算,统计出每位学生选课的门数。HAVING子句去掉不满足COUNT(*)3的组,57,例题,例32查询有3门以上课程是60分以上的学生的学号及(60分以上的)课程数SELECTSno,COUNT(*)AS及格门数FROMSCWHEREGrade=60GROUPBYSnoHAVINGCOUNT(*)=3,验证,58,使用HAVING短语筛选最终输出结果,只有满足HAVING短语指定条件的组才输出HAVING短语与WHERE子句的区别:作用对象不同WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。,59,当WHERE子句、GROUPBY子句、和HAVING子句同时出现在一个查询中时,SELECT-SQL的执行顺序如下:,l执行WHERE子句,从表中选取行l由GROUPBY对选取的行进行分组l执行集函数l执行HAVING子句选取满足条件的元组,60,例33:查询SC表中至少有2名学生选修的并以“1”开头的课程号的平均成绩,SELECTCNO,AVG(GRADE)FROMSCWHERECNOLIKE1%GROUPBYCNOHAVINGCOUNT(*)2,61,例34:查询某人成绩最低分大于50,最高分小于90的学号,SELECTSNOFROMSCGROUPBYSNOHAVINGMIN(GRADE)50ANDMAX(GRADE)=60GROUPBYSNOHAVINGCOUNT(*)=3ORDERBYSUM(GRADE)DESC,验证,63,此语句为分组排序,执行过程如下:1.(FROM)取出整个SC2.(WHERE)筛选GRADE=60的元组3.(GROUPBY)将选出的元组按SNO分组4.(HAVING)筛选选课三门以上的分组5.(SELECT)以剩下的组中提取学号和总成绩6.(ORDERBY)将选取结果排序,64,连接查询,同时涉及多个表的查询称为连接查询用来连接两个表的条件称为连接条件或连接谓词一般格式:.比较运算符:=、=、.BETWEEN.AND.,65,连接查询(续),连接字段连接谓词中的列名称为连接字段连接条件中的各连接字段类型必须是可比的,但不必是相同的,66,连接查询(续),SQL中连接查询的主要类型广义笛卡尔积(交叉连接)等值连接(含自然连接)非等值连接查询自身连接查询外连接查询复合条件连接查询,67,一、广义笛卡尔积(交叉连接),不带连接谓词的连接很少使用例:SELECTStudent.*,SC.*FROMStudent,SC,68,二、等值与非等值连接查询,等值连接、自然连接、非等值连接例1查询每个学生及其选修课程的情况。SELECTStudent.*,SC.*FROMStudent,SCWHEREStudent.Sno=SC.Sno,69,等值连接,连接运算符为=的连接操作.=.任何子句中引用表1和表2中同名属性时,都必须加表名前缀。引用唯一属性名时可以加也可以省略表名前缀。,70,等值连接,假设Student表、SC表分别有下列数据:Student表,SC表,71,等值连接,结果表Student.SnoSnameSsexSageSdeptSC.SnoCnoGrade95001李勇男20CS9500119295001李勇男20CS9500128595001李勇男20CS9500138895002刘晨女19IS9500229095002刘晨女19IS95002380,72,自然连接,等值连接的一种特殊情况,把目标列中重复的属性列去掉。例2对例1用自然连接完成。SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno=SC.Sno,73,非等值连接查询,连接运算符不是=的连接操作.比较运算符:、=、.BETWEEN.AND.,74,三、自身连接,一个表与其自己进行连接,称为表的自身连接需要给表起别名以示区别由于所有属性名都是同名属性,因此必须使用别名前缀,75,自身连接(续),例3查询每一门课的间接先修课(即先修课的先修课)SELECTFIRST.Cno,SECOND.CpnoFROMCourseFIRST,CourseSECONDWHEREFIRST.Cpno=SECOND.Cno,验证,76,自身连接(续),FIRST表(Course表),SECOND表(Course表),77,自身连接(续),查询结果173556,78,检索选修课程号为4和5的学生学号,SELECTX.SNOFROMSCASX,SCASYWHEREX.SNO=Y.SNOANDX.CNO=4ANDY.CNO=5,79,内连接,WHERE子句中指定的内连接称为旧式内连接(用比较运算符比较要连接的值的连接),WHERE子句也只支持这种连接.FROM子句中除可以用INNERJOIN指定内连接外,还可以指定其他连接方式.,80,内连接的两种形式:,SELECTsc.sno,cno,sname,gradeFROMstudent,scwherestudent.sno=sc.sno等价于SELECTsc.sno,cno,sname,gradeFROMstudentINNERJOINscONstudent.sno=sc.sno,81,四、外连接(OuterJoin),外连接与内连接的区别内连接操作只输出满足连接条件的元组外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出,82,外连接(续),外连接(OuterJoin):n它是条件连接,且条件是必需的。n若一个关系中的元组在另一个关系中没有相匹配的元组,则这些元组会在连接结果中出现,并在另一个关系的其他属性位置上放上Null,而不是像Inner那样被忽略。新的关系的属性集是参加连接的关系的属性的组合,不去除重复属性有左外连接、右外连接、全外连接,83,外连接(续),例4查询每个学生及其选修课程的情况包括没有选修课程的学生-用左外连接操作SELECTStudent.sno,Student.sname,Student.ssex,So,Sc.gradeFROMstudentLEFTOUTERJOINscONStudent.sno=Sc.sno,84,外连接(续),85,外连接(续),非主体表有一“万能”的虚行,该行全部由空值组成虚行可以和主体表中所有不满足连接条件的元组进行连接由于虚行各列全部是空值,因此与虚行连接的结果中,来自非主体表的属性值全部是空值,86,右外连接(略),SELECTStudent.sno,Student.sname,Student.ssex,So,Sc.gradeFROMstudentRIGHTOUTERJOINscONStudent.sno=sc.sno,87,全连接,SELECTStudent.sno,Student.sname,Student.ssex,So,Sc.gradeFROMstudentFULLOUTERJOINscONStudent.sno=Sc.sno,88,五、复合条件连接,WHERE子句中含多个连接条件时,称为复合条件连接例5查询选修2号课程且成绩在90分以上的所有学生的学号、姓名SELECTStudent.Sno,student.SnameFROMStudent,SCWHEREStudent.Sno=SC.SnoAND/*连接谓词*/SC.Cno=2AND/*其他限定条件*/SC.Grade60/*其他限定条件*/,89,多表连接,例6查询每个学生的学号、姓名、选修的课程名及成绩。SELECTStudent.Sno,Sname,Cname,GradeFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoandSC.Cno=Course.Cno结果:Student.SnoSnameCnameGrade95001李勇数据库9295001李勇数学8595001李勇信息系统8895002刘晨数学9095002刘晨信息系统80,90,综合举例:,查询选修了2门以上课程的学生学号、姓名、平均成绩。SELECTsc.sNO,sname,AVG(GRADE)FROMSC,studentwheresc.sNO=student.sNOGROUPBYsc.sNO,snameHAVINGCOUNT(*)2,验证,91,嵌套查询,嵌套查询概述嵌套查询分类嵌套查询求解方法引出子查询的谓词,92,嵌套查询(续),嵌套查询概述一个SELECT-FROM-WHERE语句称为一个查询块将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询,93,嵌套查询(续),SELECTSname/*外层查询,父查询*/FROMStudentWHERESnoIN(SELECTSno/*内层查询,子查询*/FROMSCWHERECno=2),94,嵌套查询(续),子查询的限制不能使用ORDERBY子句层层嵌套方式反映了SQL语言的结构化有些嵌套查询可以用连接运算替代,95,嵌套查询分类,不相关子查询子查询的查询条件不依赖于父查询相关子查询子查询的查询条件依赖于父查询,96,嵌套查询求解方法,不相关子查询是由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。,97,嵌套查询求解方法(续),相关子查询首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表;然后再取外层表的下一个元组;重复这一过程,直至外层表全部检查完为止。,98,引出子查询的谓词,带有IN谓词的子查询带有比较运算符的子查询带有ANY(SOME)或ALL谓词的子查询带有EXISTS谓词的子查询,99,一、带有IN谓词的子查询,例7查询与“张红”在同一个系学习的学生。此查询要求可以分步来完成确定“张红”所在系名SELECTSdeptFROMStudentWHERESname=张红结果为:SdeptIS,100,带有IN谓词的子查询(续),查找所有在IS系学习的学生。SELECTSno,Sname,SdeptFROMStudentWHERESdept=IS;结果为:SnoSnameSdept95001张红IS95004张立IS,101,构造嵌套查询,将第一步查询嵌入到第二步查询的条件中SELECTSno,Sname,SdeptFROMStudentWHERESdeptIN(SELECTSdeptFROMStudentWHERESname=张红)此查询为不相关子查询。DBMS求解该查询时也是分步去做的。,102,带有IN谓词的子查询(续),用自身连接完成本查询要求SELECTS1.Sno,S1.Sname,S1.SdeptFROMStudentS1,StudentS2WHERES1.Sdept=S2.SdeptANDS2.Sname=张红,103,带有IN谓词的子查询(续),父查询和子查询中的表均可以定义别名SELECTSno,Sname,SdeptFROMStudentS1WHERES1.SdeptIN(SELECTSdeptFROMStudentS2WHERES2.Sname=张红),104,带有IN谓词的子查询(续),例8查询选修了课程名为“操作系统”的学生学号和姓名SELECTSno,Sname-最后在Student关系中FROMStudent-取出Sno和SnameWHERESnoIN(SELECTSno-然后在SC关系中找出选FROMSC-修了3号课程的学生学号WHERECnoIN(SELECTCno-首先在Course关系中找出FROMCourse-”操作系统”的课程号,结果为3号WHERECname=操作系统),验证,105,带有IN谓词的子查询(续),用连接查询SELECTStudent.Sno,SnameFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoANDSC.Cno=Course.CnoANDCourse.Cname=操作系统,106,二、带有比较运算符的子查询,子查询返回一行一列。运算符:、=、=、子查询返回多行一列运算符:In、All、Some(Any)、Exists,107,带有比较运算符的子查询(续),例9:假设一个学生只可能在一个系学习,并且必须属于一个系,可以用=代替IN:SELECTSno,Sname,SdeptFROMStudentWHERESdept=(SELECTSdeptFROMStudentWHERESname=欧阳克),108,带有比较运算符的子查询(了解),一般子查询一定要跟在比较符之后标准SQL不允许的例子(在SQLSERVER中可以)SELECTSno,Sname,SdeptFROMStudentWHERE(SELECTSdeptFROMStudentWHERESname=欧阳克)=Sdept,109,三、带有ANY(SOME)或ALL谓词的子查询,谓词语义(子查询多值)in指出包含在一个子查询的查询结果中。All表示与子查询结果中所有记录的相比均符合要求才算满足条件。Any表示与子查询结果中有任意一个记录满足,就算符合满足条件。Some表示与子查询结果中有任意一些记录满足,就算符合满足条件。(SOME和ANY一样,新SOME),110,带有ANY(SOME)或ALL谓词的子查询(续),需要配合使用比较运算符ANY大于子查询结果中的某个值ALL大于子查询结果中的所有值=ANY大于等于子查询结果中的某个值=ALL大于等于子查询结果中的所有值)ANY不等于子查询结果中的某个值!=(或)ALL不等于子查询结果中的任何一个值,111,带有ANY或ALL谓词的子查询(续),例10查询其他系中比信息系任意一个(其中某一个)学生年龄小的学生姓名和年龄SELECTSname,SageFROMStudentWHERESageIS/*注意这是父查询块中的条件*/,112,带有ANY或ALL谓词的子查询(续),例11:用集函数实现:查找其它系中比IS系任一学生年龄小的学生名单SELECTSname,SageFROMStudentWHERESageIS,113,带有ANY或ALL谓词的子查询(续),结果SnameSage王敏18执行过程1.DBMS执行此查询时,首先处理子查询,找出IS系中所有学生的年龄,构成一个集合(19,18)2.处理父查询,找所有不是IS系且年龄小于19或18的学生,114,带有ANY或ALL谓词的子查询(续),ANY和ALL谓词有时可以用集函数实现ANY与ALL与集函数的对应关系,115,带有ANY或ALL谓词的子查询(续),用集函数实现子查询通常比直接用ANY或ALL查询效率要高,因为前者通常能够减少比较次数,116,带有ANY或ALL谓词的子查询(续),例12查询其他系中比信息系所有学生年龄都小的学生姓名及年龄。方法一:用ALL谓词SELECTSname,SageFROMStudentWHERESageIS,117,带有ANY或ALL谓词的子查询(续),方法二:用集函数SELECTSname,SageFROMStudentWHERESageIS,118,四、带有EXISTS谓词的子查询,1.EXISTS谓词2.NOTEXISTS谓词3.不同形式的查询间的替换4.相关子查询的效率5.用EXISTS/NOTEXISTS实现全称量词6.用EXISTS/NOTEXISTS实现逻辑蕴函,119,带有EXISTS谓词的子查询(续),1.EXISTS谓词存在量词带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。若内层查询结果非空,则返回真值若内层查询结果为空,则返回假值由EXISTS引出的子查询,其目标列表达式通常都用*,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义2.NOTEXISTS谓词,120,带有EXISTS谓词的子查询(续),例13查询所有选修了1号课程的学生姓名。用嵌套查询SELECTSnameFROMStudentWHEREEXISTS(SELECT*FROMSC/*相关子查询*/WHERESno=Student.SnoANDCno=1)求解过程,验证,121,带有EXISTS谓词的子查询(续),思路分析:本查询涉及Student和SC关系。在Student中依次取每个元组的Sno值,用此值去检查SC关系。若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno=1,则取此Student.Sname送入结果关系。,122,带有EXISTS谓词的子查询(续),用连接运算SELECTSnameFROMStudent,SCWHEREStudent.Sno=SC.SnoANDSC.Cno=1,123,带有EXISTS谓词的子查询(续),例14查询没有选修1号课程的学生姓名。SELECTSnameFROMStudentWHERENOTEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno=1)此例用连接运算难于实现,验证,124,带有EXISTS谓词的子查询(续),3.不同形式的查询间的替换一些带EXISTS或NOTEXISTS谓词的子查询不能被其他形式的子查询等价替换所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。,125,带有EXISTS谓词的子查询(续),例15:查询与“张红”在同一个系学习的学生。可以用带EXISTS谓词的子查询替换:SELECTSno,Sname,SdeptFROMStudentS1WHEREEXISTS(SELECT*FROMStudentS2WHERES2.Sdept=S1.SdeptANDS2.Sname=张红),126,带有EXISTS谓词的子查询(不讲),5.用EXISTS/NOTEXISTS实现全称量词(难点)SQL语言中没有全称量词(Forall)可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:(x)P(x(P),127,带有EXISTS谓词的子查询(续),例16查询选修了全部课程的学生姓名。SELECTSnameFROMStudentWHERENOTEXISTS(SELECT*FROMCourseWHERENOTEXISTS(SELECT*FROMSCWHERESC.Sno=Student.SnoANDCno=Course.Cno),128,带有EXISTS谓词的子查询(不讲),6.用EXISTS/NOTEXISTS实现逻辑蕴函(难点)SQL语言中没有蕴函(Implication)逻辑运算可以利用谓词演算将逻辑蕴函谓词等价转换为:pqpq,129,带有EXISTS谓词的子查询(续),例17查询至少选修了学生04010003选修的全部课程的学生号码。解题思路:用逻辑蕴函表达:查询学号为x的学生,对所有的课程y,只要04010003学生选修了课程y,则x也选修了y。形式化表示:用P表示谓词“学生04010003选修了课程y”用q表示谓词“学生x选修了课程y”则上述查询为:(y)pq,130,带有EXISTS谓词的子查询(续),等价变换:(y)pq(y(pq)(y(pq)y(pq)变换后语义:不存在这样的课程y,学生04010003选修了y,而学生x没有选。,131,带有EXISTS谓词的子查询(续),用NOTEXISTS谓词表示:SELECTDISTINCTSnoFROMSCSCXWHERENOTEXISTS(SELECT*FROMSCSCYWHERESCY.Sno=04010003ANDNOTEXISTS(SELECT*FROMSCSCZWHERESCZ.Sno=SCX.SnoANDSCZ.Cno=SCY.Cno),132,集合查询,标准SQL直接支持的集合操作种类并操作(UNION)一般商用数据库支持的集合操作种类并操作(UNION)交操作(INTERSECT)差操作(MINUS),133,1并操作,形式UNION参加UNION操作的各结果表的列数必须相同;对应项的数据类型也必须相同,134,并操作(续),例18查询计算机科学系的学生及年龄不大于19岁的学生的学号和姓名。方法一:SELECTSNO,SNAMEFROMStudentWHERESdept=CSUNIONSELECTSNO,SNA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论