数据库上课第七讲SQL语言_4(复杂查询)..ppt

数据库上课第七讲SQL语言_4(复杂查询)..ppt

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ANY(或SOME),ALL谓词与聚集函数、IN谓词的等价转换关系 * * = 或!= = = ANY IN MAX =MAX MIN = MIN ALL NOT IN MIN = MIN MAX = MAX 1.3 使用存在量词EXISTS的子查询 量词有两种:存在量词、全称量词 SQL仅提供存在量词的运算,使用谓词EXISTS表示 全称量词转化通过NOT EXISTS谓词来实现 WHERE子句中的谓词EXISTS用来判断其后的子查询的结果集合中是否存在元素; 谓词EXISTS大量用于相关子查询中。 * * [例3.43] 查询选修了“计算机原理”课程的同学姓名、所在班级编号。 该查询可直接通过连接运算实现,也可以通过IN子查询来实现。还可以通过存在量词实现: SELECT studentName, classNo FROM Student x WHERE EXISTS ( SELECT * FROM Score a, Course b WHERE a.courseNo=b.courseNo AND a.studentNo=x.studentNo AND courseName=计算机原理 ) 相关子查询 * * 外层查出结果逐条代入,有结果,则保留为结果集 本查询涉及Student、Score和Course三个关系,属于相关子查询,查询过程如下: (1) 首先取Student表的第一个元组x,并取其学号x.studentNo; (2) 执行子查询,该子查询对表Score和Course进行连接,并选择其学号为x.studentNo,其课程名为“计算机原理”的元组; (3) 如果子查询中可以得到结果(即存在元组),则将Student表中元组x的学生姓名和所在班级编号组成一个新元组放在结果集合中;否则(即不存在元组),直接丢弃元组x; (4) 如果Student表中还有元组,则取Student表的下一个元组x,并取其学号x.studentNo,转第(2)步;否则转第(5)步; (5) 将结果集合中的元组作为一个新关系输出 子查询的目标列通常是* 存在量词EXISTS只判断其后的子查询的结果集合中是否存在元素,无列名 * * [例3.44] 查询选修了所有课程的学生姓名。 分析: 本查询要使用全称量词,含义是: 选择这样的学生,任意一门课程他都选修了 SQL中没有全称量词,使用存在量词和取非运算来实现 含义:查询这样的学生x,不存在他没有选修的课程c。 * * SELECT studentName FROM Student x WHERE NOT EXISTS ( SELECT * FROM Course c WHERE NOT EXISTS ( SELECT * FROM Score WHERE studentNo=x.studentNo AND courseNo=c.courseNo ) ) * * /*判断学生x.studentNo没有选修课程c.courseNo*/ 相关子查询在SQL中属于复杂的查询,其子查询的查询条件依赖于外层查询的元组值 当外层查询的元组值发生变化时,其子查询要重新依据新的条件进行查询 使用EXISTS的相关子查询处理过程是: (1) 首先取外层查询的第一个元组; (2) 依据该元组的值,执行子查询; (3) 如果子查询的结果非空(EXISTS量词返回真值),将外层查询的该元组放入到结果集中;否则(EXISTS量词返回假值),舍弃外层查询的该元组; (4) 取外层查询的下一个元组,返回第(2)步重复上述过程,直到外层查询所有的元组处理完毕; (5) 将结果集合中的元组作为一个新关系输出 * * 带有EXISTS谓词的子查询总结 1. EXISTS谓词 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 若内层查询结果非空,则外层的WHERE子句返回真; 若内层查询结果为空,则外层的WHERE子句返回假; 由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义 2. NOT EXISTS谓词 若内层查询结果非空,则外层的WHERE子句返回假值 若内层查询结果为空,则外层的WHERE子句

文档评论(0)

kabudou + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档