- 1、本文档共85页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.3.1 等值与非等值连接 自然连接 SQL不直接支持自然连接,完成自然连接的方法是在等值连接的基础上消除重复列 [例3.30] 实现成绩表Score和课程表Course的自然连接。 SELECT studentNo, a.courseNo, score, courseName, creditHour, courseHour, priorCourse FROM Score a, Course b WHERE a.courseNo=b.courseNo // 表a与表b的连接条件 本例课程编号在两个关系中同时出现,但在SELECT子句中仅需出现1次,因此使用a.courseNo,也可以使用b.courseNo。其他列名是唯一的,不需要加上元组变量 * 3.3.1 等值与非等值连接 非等值连接 非等值连接使用的比较少。 在关系代数部分已经举过了一个非等值连接的例子(P61-63,例2.16),这里就不再举例了。 在数据库ScoreDB中,查找课程号为“AC001”课程的考试中比学号为“0703045”的学生考得更好的所有学生的姓名和成绩。 * 3.3.2 自表连接 若某个表与自己进行连接,称为自表连接 [例3.31] 查找同时选修了编号为“001”和“002”课程的同学学号、姓名、课程号和相应成绩,并按学号排序输出。 学生姓名在学生表中,FROM子句必须包含学生表(取别名为a) 可以考虑两个成绩表,分别记为b和c b表用于查询选修了编号为“001”课程的同学 c表用于查询选修了编号为“002”课程的同学 FROM子句还必须包含两个成绩表b和c,且在WHERE子句中包含两个选择条件: b.courseNo=001 AND c.courseNo=002 * 3.3.2 自表连接 一方面,成绩表b与成绩表c在学号上做等值连接(自表连接),如果连接成功,表示学生同时选修了编号为“001”和“002”的课程 另一方面,学生表与成绩表b (或成绩表c)在学号上做等值连接。WHERE子句包含两个连接条件: b.studentNo=c.studentNo AND a.studentNo=b.studentNo 本查询语句为: SELECT a.studentNo, studentName, b.courseNo, b.score, c.courseNo, c.score FROM Student a, Score b, Score c WHERE b.courseNo=001 AND c.courseNo=002 AND a.studentNo=b.studentNo AND b.studentNo=c.studentNo ORDER BY a.studentNo 本查询结果与例3.29相同 在该查询中,FROM子句后面包含了两个参与自表连接的成绩表Score,必须定义元组变量加以区分 自表连接的条件是b.studentNo=c.studentNo * 3.3.2 自表连接 [例3.32] 在学生表Student中查找与“李宏冰”同学在同一个班的同学姓名、班级编号和出生日期。 SELECT a.studentName, a.classNo, a.birthday FROM Student a, Student b WHERE b.studentName=李宏冰 AND a.classNo=b.classNo 或 SELECT a.studentName, a.classNo, a.birthday FROM Student a, ( SELECT * FROM Student WHERE studentName=李宏冰 ) b WHERE a.classNo=b.classNo * 3.3.3 外连接 在一般的连接中,只有满足连接条件的元组才被检索出来,对于没有满足连接条件的元组是不作为结果被检索出来的。 [例3.33] 查询每个班级的班级名称、所属学院、学生学号、学生姓名,按班级名称排序输出。 SELECT className, institute, studentNo, studentName FROM Class a, Student b WHERE a.classNo=b.classNo ORDER BY className * 3.3.3 外连接 从查询结果中可以看出: 班级表中的“注册会计08_01班”、“注册会计08_03班”以及“金融管理07_01班”这3个班没有出现在查询结果中,原因是这3个班没有学生 在实际应用中,往往需要将不满足连接条件的元组也检索出来,只是在相应的位置用空值替代
文档评论(0)