AnIntroductiontoDatabaseSystem数据库系统概论AnIntroductiontoDatabaseSystem第三章关系数据库标准语言SQL(续1)AnIntroductiontoDatabaseSystem3.3查询3.3.1概述3.3.2单表查询3.3.3连接查询3.3.4嵌套查询3.3.5集合查询3.3.6小结AnIntroductiontoDatabaseSystem3.3.3连接查询查询结果或条件涉及多个表的查询称为连接查询SQL中连接查询的主要类型广义笛卡尔积等值连接(含自然连接)自身连接查询外连接查询AnIntroductiontoDatabaseSystem一、广义笛卡尔积不带连接谓词的连接很少使用例:SELECT*FROMStudent,SCAnIntroductiontoDatabaseSystem二、等值与非等值连接查询[例32]查询每个学生及其选修课程的情况。用WHERE子句指定连接条件:SELECT*FROMStudent,SCWHEREStudent.Sno=SC.Sno;AnIntroductiontoDatabaseSystem等值连接结果表Student.SnoSnameSsexSageSdeptSC.SnoCnoGrade95001李勇男20CS9500119295001李勇男20CS9500128595001李勇男20CS9500138895002刘晨女19IS9500229095002刘晨女19IS95002380AnIntroductiontoDatabaseSystem二、等值与非等值连接查询[例32]查询每个学生及其选修课程的情况。用WHERE子句指定连接条件:SELECT*FROMStudent,SCWHEREStudent.Sno=SC.Sno;或,用FROM子句指定连接条件:SELECT*FROMStudentJOINSCONStudent.Sno=SC.Sno;不建议用JOIN方式AnIntroductiontoDatabaseSystem等值连接前例是一种等值连接等值连接:连接运算符为=的连接操作SELECT*FROMStudent,SCWHEREStudent.Sno=SC.Sno;引用两表中同名属性时,必须加表名前缀区分。AnIntroductiontoDatabaseSystem自然连接将等值连接的目标列中重复的属性列去掉,就是自然连接。[例33]对[例32]用自然连接完成。SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno=SC.Sno;AnIntroductiontoDatabaseSystem带有选择条件的连接查询[例补充]查询选1号课的学生号,学生名,成绩SELECTStudent.Sno,Sname,GradeFROMStudent,SCWHEREStudent.Sno=SC.SnoANDCno=1;连接条件选择条件AnIntroductiontoDatabaseSystem带有选择条件的连接查询[例补充]查询选1号课的学生号,学生名,成绩SELECTStudent.Sno,Sname,GradeFROMStudent,SCWHEREStudent.Sno=SC.SnoANDCno=1;或:SELECTStudent.Sno,Sname,GradeFROMStudentJOINSCONStudent.Sno=SC.Sno;WHERECno=1;AnIntroductiontoDatabaseSystem[例35]查询选修2号课程且成绩在90分以上的所有学生的学号、姓名SELECTStudent.Sno,Student.SnameFROMStudent,SCWHEREStudent.Sno=SC.Sno/*连接条件*/ANDCno=2/*选择条件*/ANDGrade90;/*选择条件*/带有选择条件的连接查询AnIntroductiontoDatabaseSystem(当查询条件和结果来自两个关系时,用连接)1查询CS系的学号,姓名,课号,成绩2查询成绩大于95的姓名3查询选1号课成绩不及格的姓名4查询李勇选修的课号,成绩5查询95001选修的课号,课名6查询数据库原理课的学号,成绩练一练:AnIntroductiontoDatabaseSystem三、自身连接一个表与其自己进行连接,称为表的自身连接AnIntroductiontoDatabaseSystem[例34]查询每一门课的先行课名FirstSecondAnIntroductiontoDatabaseSystem自身连接(续)[例34]查询每一门课的先行课名SELECTFirst.Cname课名,Second.Cname先行课名FROMCourseFirst,courseSecondWHEREFirst.Cpno=Second.Cno;课名先行课名数据库数据结构信息系统数据库。。。。。。。AnIntroductiontoDatabaseSystem三、自身连接自身连接注意问题:1.需要给表起别名以示区别2.由于所有属性名都是同名属性,因此必须使用别名前缀AnIntroductiontoDatabaseSystem四、外连接(OuterJoin)普通连接操作只输出满足连接条件的元组SELECT*FROMStudent,SCWHEREStudent.Sno=SC.Sno;只输出满足Student.Sno=SC.Sno的行外连接操作可以将指定表中不满足连接条件的元组一并输出AnIntroductiontoDatabaseSystem外连接(续)[例33]查询每个学生及其选修课程的情况(包括没有选修课程的学生)---用外连接操作SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno*=SC.Sno;AnIntroductiontoDatabaseSystem外连接(续)查询结果:Student.SnoSnameSsexSageSdeptCnoGrade95001李勇男20CS19295001李勇男20CS28595001李勇男20CS38895002刘晨女19IS29095002刘晨女19IS38095003王敏女18MAnullnull95004张立男19ISnullnull本例中将左边的学生关系不满足连接条件的行输出,称为左外连接AnIntroductiontoDatabaseSystem外连接(续)练习:查询课名,学生号,成绩,包括没有被选修的课程AnIntroductiontoDatabaseSystem外连接(续)[例33]查询每个学生及其选修课程的情况(包括没有选修课程的学生)---用外连接操作用FROM子句指定连接条件:SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudentLEFTOUTERJOINSCONStudent.Sno=SC.Sno;ORACLE:LEFTOUTJOINAnIntroductiontoDatabaseSystem外连接(续)SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno*=SC.Sno;或SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudentLEFTOUTERJOINSCONStudent.Sno=SC.Sno;AnIntroductiontoDatabaseSystem外连接(续)左外连接右外连接全外连接AnIntroductiontoDatabaseSystem外连接(续)左外连接将左边关系的不满足连接条件的行输出WHERE子句方式(*出现在左边):WHERER.A1*=S.A1FROM子句方式:FROMRLEFT[OUTER]JOINSONR.A1=S.A1AnIntroductiontoDatabaseSystem外连接(续)右外连接将右边关系的不满足连接条件的行输出WHERE子句方式(*出现在右边):WHERER.A1=*S.A1FROM子句方式:FROMRRIGHT[OUTER]JOINSONR.A1=S.A1AnIntroductiontoDatabaseSystem外连接(续)全外连接将两边关系的不满足连接条件的行输出WHERE子句方式(*出现在两边):WHERER.A1*=*S.A1FROM子句方式:FROMRFULL[OUTER]JOINSONR.A1=S.A1AnIntroductiontoDatabaseSystem多表连接[例36]查询每个学生的学号、姓名、选修的课程名及成绩。AnIntroductiontoDatabaseSystem多表连接[例36]查询每个学生的学号、姓名、选修的课程名及成绩。SELECTStudent.Sno,Sname,Cname,GradeFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoANDSC.Cno=Course.Cno;结果:Student.SnoSnameCnameGrade95001李勇数据库9295001李勇数学85....................................AnIntroductiontoDatabaseSystem多表连接+选择条件[例:补充]查询CS系选数据库课成绩90的学生的学号、姓名、成绩。AnIntroductiontoDatabaseSystem多表连接+选择条件[例:补充]查询CS系选数据库课成绩90的学生的学号、姓名、成绩。SELECTStudent.Sno,Sname,GradeFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoANDSC.Cno=Course.CnoANDSdept='CS'ANDCname='数据库'ANDGrade90;AnIntroductiontoDatabaseSystem练习Student(Sno,Sname,Ssex,Sage,Sdept)Course(Cno,Cname,Cpno,Ccredit)SC(Sno,Cno,Grade)查询选1号课的学生号,学生名,成绩(用连接)查询每个学号的选课平均成绩,总学分(用连接,分组)AnIntroductiontoDatabaseSystem3.3查询3.3.1概述3.3.2单表查询3.3.3连接查询3.3.4嵌套查询3.3.5集合查询3.3.6小结AnIntroductiontoDatabaseSystem3.3.4嵌套查询嵌套查询概述嵌套查询分类嵌套查询求解方法引出子查询的谓词AnIntroductiontoDatabaseSystem嵌套查询(续)嵌套查询概述一个SELECT-FROM-WHERE语句称为一个查询块将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询AnIntroductiontoDatabaseSystem嵌套查询(续)SELECTSname外层查询/父查询FROMStudentWHERESnoIN(SELECTSno内层查询/子查询FROMSCWHERECno=2);AnIntroductiontoDatabaseSystem嵌套查询分类不相关子查询子查询的查询条件不依赖于父查询相关子查询子查询的查询条件依赖于父查询AnIntroductiontoDatabaseSystem引出子查询的谓词带有IN谓词的子查询带有比较运算符的子查询带有ANY或ALL谓词的子