- 1、本文档共244页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《数据库原理及应用-(SQLServer2008版)》唐国良蔡中民-第5章课案
表5-11 ANY、ALL、IN关键字与聚合函数的等价关系 NOT IN !=(或)ALL IN = ANY =MIN = ALL =MAX = ANY =MAX = ALL =MIN = ANY MIN ALL MAX ANY MAX ALL MIN ANY 等价聚合函数 ALL与运算符组合 等价聚合函数 ANY与运算符组合 5.4.3 多列多值嵌套查询 如果子查询的结果集是一个多行多列的表,这样的查询称为多列多值嵌套查询。由于子查询返回多列多值,因此,在父查询中只能够使用关键字EXISTS或NOT EXISTS进行匹配筛选。 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“TRUE”或逻辑假值“FALSE”。若内层查询结果非空,则外层的WHERE子句返回真值。若内层查询结果为空,则外层的WHERE子句返回假值。 【例5-60】查询参加选修的学生的姓名、性别。 SELECT sname,ssex FROM student WHERE EXISTS (SELECT * FROM grade WHERE student.s_id = grade.s_id) 由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。 本例中子查询的查询条件依赖于外层父查询的某个属性值(在本例中是student.s_id值),因此是相关子查询。 在本例中查询过程是这样的:首先取外层查询student表中第一个元组,根据它与内层查询相关的属性值grade.s_id处理内层查询,若外层查询的WHERE子句返回值为TRUE,则取外层查询中该元组的sname和ssex值放入外层查询的结果集中;然后再取外层查询student表中的下一个元组;重复这一过程,直到外层student表中的元组全部检查完为止。 具体执行过程如下: 1.从外层查询中取出student的第一个元组t,将元组t的s_id(2010190001)值传送给内层查询。 SELECT * FROM grade WHERE ‘2010190001’= grade.s_id 2. 执行内层查询,得到值(78,52,67,89),用该值代替内层查询,得到外层查询: SELECT sname,ssex FROM student WHERE EXISTS(78,52,67,89) 3. 执行这个查询,得到 (赵青,女) 然后再在外层查询中取出下一个元组,重复上述的1至3步,直到外层student的元组全部处理完毕为止。结果集为 赵青,女 李华,女 张三,男 … ,… 【例5-61】查询没有选修1号课程的学生姓名。 SELECT sname FROM student WHERE NOT EXISTS (SELECT * FROM grade WHERE s_id = student.s_id AND c_id=1 ) /*相关子查询*/ 所有的单列单值和单列多值的嵌套查询都能用多列多值嵌套查询等价替换,但一些多值多列嵌套查询却不能被其他形式的嵌套查询等价替换。例如【例5-55】“查询选修2号课程的学生的学号和姓名”就可以等价替换为: SELECT s_id,sname FROM student WHERE EXISTS (SELECT * FROM grade WHERE student.s_id=grade.s_id AND c_id= 2) 5.4.4 带有EXISTS谓词的子查询 1. EXISTS谓词 (1)EXISTS代表存在量词? (2)带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 若内层查询结果非空,则外层的WHERE子句返回真值 若内层查询结果为空,则外层的WHERE子句返回假值 (3)由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。 2. NOT EXISTS谓词 若内层查询结果非空,则外层的WHERE子句返回假值 若内层查询结果为空,则外层的WHERE子句返回真值 【例5-62】查询所有选修了1号课程的学生姓名。 FROM student INNER JOIN grade ON student.s_id = grade.s_id 其执行结果如图5-28,与【例5-44】程序的执行结果完全相同。 使用[INNER]JOIN除了可以完成WHERE子句所完成的等值连接查询,也可以完成自连接查询。 【例5-49】查询比“张三”年龄小的学生的学号,姓名,出生日期。 SELECT b.s_id,b.sname,b.sbirthday FROM
文档评论(0)