- 1、本文档共30页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六讲多表查询讲述
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 《数据库系统及应用》 主讲人:陈业斌 教授 安徽工业大学 03 外连接运算(重点) 01 广义笛卡尔积运算 02 内连接运算(重点) 04 一般子查询(重点) 05 相关子查询(难点) 06 传统的集合运算的实现 目 录 第六讲 多表查询 广义笛卡尔积 在连接操作中,如果不用连接条件,则称为无条件连接。 无条件连接是不带WHERE子句的连接语句是笛卡儿积,无条件连接将产生大量的行 [例]:SELECT * FROM xs,kc; ?SELECT * FROM xs,kc,cj; 这条语句会产生多少条记录? θ连接 连接条件的一般格式是: [表名1.]列名1 比较运算符 [表名2.]列名2 其中:比较运算符主要有:=、、、=、=、!= [注意]:连接条件中的各连接字段类型必须是可比较的。 [执行过程]: 首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第1个元组与该元组拼接形成结果表中的一个元组。表2全部找完后,再找表1中的第2个元组,然后再从头扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第2个元组与该元组拼接形成结果表中的一个元组。重复执行,直到表1中的全部元组都处理完毕为止。 θ连接 [例]:求学生以及其选修课程的情况。 SQL92标准: select xs.*,cj.* from xs,cj where xs.sno=cj.sno; SQL99标准: select xs.*,cj.* from xs join cj on xs.sno=cj.sno ; 注意:SQL没有实现自然连接 表的别名 一般格式是:表名 表的别名 简化输入; 表与自身连接; 在嵌套查询中使用。 [例]:查找选修了“计算机基础”课程且成绩在80分以上的学生学号、姓名、课程名及成绩。 select a.sno,sname,c.cno,grade from xs a join cj b on a.sno=b.sno join kc c on b.cno=c.cno where cname=计算机基础 and grade=80; 自连接 同一个表之间可进行自身连接 需要给表起别名以示区别 由于所有属性名都是同名属性,因此必须使用别名前缀 [执行过程]: 可以把一个看成两个副本,即两个相同的表,然后再对这两个表进行连接。表与自身的连接必须使用表的别名,若在FROM子句中用两个不同的别名对应于同一个表时,就可以象连接两个不同的表一样来连接。 自连接 [例]:求年龄大于王燕的所有学生的姓名、专业名和出生日期。 select * from xs a join xs b on a.snob.sno where a.sname=王燕 and a.birthdayb.birthday ; 外连接 在FROM子句中采用如下表现形式: (1)左外连接(LEFT [OUTER] JOIN):结果表中除了包括满足连接条件的行外,还包括左表的所有行; (2)右外连接(RIGHT [OUTER] JOIN):结果表中除了包括满足连接条件的行外,还包括右表的所有行; (3)?完全外连接(FULL [OUTER] JOIN):结果表中除了包括满足连接条件的行外,还包括两个表的所有行。 外连接 [例]:查找未选修任何课程的学生。 select * from xs a left join cj b on a.sno=b.sno where b.sno is null; 子查询 概念 查询块:一个select-from-where语句称为一个查询块。 嵌套子查询: select-from-where (select-from-where)。 处理步骤:一般由里向外进行处理。 为什么要用子查询 某一元素是否是某一个集合的成员; 某一个集合是否包含另一个集合; 测试集合是否为空. 子查询 (1) 返回单值的子查询 子查询返回的结果是一个值时,可以使用比较运算符(=, , , =, =, !=)将父查询和子查询连接起来。 (2) 返回一组值的子查询 子查询返回的结果不是一个值而是而是一个集合即多个值,就不能简单地使用比较运算符,而必须使用多值比较运算符,以指明在WHERE子句中应如何使用这些返回值。 子查询 select sno from kc,cj where kc.cno=cj
文档评论(0)