MSSQLSQL之EXISTS用法.ppt

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MSSQLSQL之EXISTS用法

专题:SQL之EXISTS * exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。not exists则相反 它所在的查询属于相关子查询,即子查询的查询条件依赖于外层父查询的某个属性值,处理过程一般为: 取外层查询的第一个元组,根据它与内层查询相关的属性值处理内层查询,若where子句返回true,则将此元组放入结果表,然后取下一个元组,重复这个过程直到全部检查完为止 * 即:exists做为where 条件时,是先对where 前的主查询进行查询,然后用主查询的结果一个一个的代入exists的子查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出 * 建立程序循环的概念,这是一个动态的查询过程。如 FOR循环 。 流程为首先取出外层中的第一个元组, 再执行内层查询,将外层表的第一元组代入,若内层查询为真,即有结果时,返回外层表中的第一元 组,接着取出第二元组,执行相同的算法。一直到扫描完外层整表 。 * ? for(int i =0; iEOFout;i++) ???????????????? { ???????????????????? for (int j = 0 ; jEOFin;j++) ??????????????? } * 使用EXISTS,首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。 而执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。 因此,使用EXISTS比使用IN通常查询速度快。 * 1、查询选修了全部课程的学生姓名 * 思路一(in) 首先学生的选课信息存在于SC表中, 要想知道某个学生是否选修了全部课程,至少我们需要知道一共有几门课程。 其次,学生选修了与否,我们又要扫描SC全表,统计出选修了所有课程的学生号 最后在STUDENT表中根据学生号打出姓名 * 思路一(in) select Sname from student????????????? where Sno IN ?? (select Sno from SC ?? group by Sno //根据Sno分组,统计每个 //学生选修了几门课程。如果等于course的 //总数,就是我们要找的Sno ??? having count(*) = (select count(*) from course ) )??? //统计course中共有几门课程 * 思路二(EXISTS) 引入:将题目换为 查找学号为 00003 没有选修的科目?? 思路: 将已知学号00003代入 把每一个科目代入(循环) 将上述两个条件组合,一一与SC表中的学号( 00003 )和科目进行比对,找不到匹配的就是00003 没有选修的科目 * select Cname from course where not exists//找不到的组合,提交course ?????? (select * from SC where course.cno = cno and sno = 00002) //在SC中匹配 * 思路二(EXISTS) 换个题目: 查找没有 没有选修科目的学生姓名 思路:学号未知 , 科目未知,说明有两个未知变量。应该有两个EXISTS。 可以扫描student 和 course共有 s * c 中组合,将这些组合与SC的每一项进行匹配,注意s*c组合已经包含所有可能。如果全部找到 ,就说明已经选修了全部课程。找不到就说明有课程没选修 。再将没选修的的提交给上一exists 循环 。若上一exists 不存在的再提交给外循环。 * 思路二(EXISTS) select Sname from student ?????where NOT exists??????? // ??????? (select * from course ?????????????where NOT exists?//不存在的提 //交给course ?????????????????????(select * from SC where ????????????????Sno = student.sno and cno = Course.Cno)? // 代//入两个未知变量 ) * 回头看,就是我们第一个引出的题目: 选修了全部课程的学生姓名 “选了全部课程的学生” 变成“找这样的学生 :不存在一门课他没选的,也就是没有课程他没有选 举一反三,请写出 被全部学生都选的课程 被全部学生都不选的

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档