文档详情

SQL之EXISTS双重嵌套修正版.ppt

发布:2017-05-09约2.65千字共16页下载文档
文本预览下载声明
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) 引入:将题目换为 查找学号为 95003 没有选修的课程?? 思路: 将已知学号95003代入 把每一个课程代入(循环) 将上述两个条件组合,一一用外层查询的课程(课程表的课程)与SC表(选课表)中的学号( 95003 )的对应课程进行比对,找不到匹配的(相同的)就是95003 没有选修的课程, 因为选修的课程在选课表里有,在课程表里也有,就相互匹配,若课程表里有而选课表里没有的课程,就是该学生没有选修该课程了。 select Cname from course where not exists//在SC中找不到与课程表匹配//的课程,提交true给course表,输出cname值 ?????? (select * from SC where course.cno = cno and sno = ‘95003) //在SC中匹配 思路二(EXISTS) 换个题程: 查找没有 没有选修课程的学生姓名 思路:学号未知 , 课程未知,说明有两个未知变量。应该有两个EXISTS。 可以扫描student 和 course共有 s * c 中组合,将这些组合(s外循环c内循环)与SC的每一项进行匹配,注意s*c组合已经包含所有可能。如果某个学生在选课表中匹配的全部课程等于课程表,就说明某学生已经选修了全部课程。如果课程表的课程与某个学生在选课表中有没有匹配的课程,就说明课程表中不匹配的课程是某个学生没选修 。没选修就为true提交给上一not exists 循环 。上一not exists 循环就为false再提交给外层查询不选这个学生。如果课程表的课程与某个学生在SC表中的课程全部相同,就以false提交上一not exists,上一not exists就为true返回最外层查询,输出这个学生的姓名。 思路二(EXISTS) select Sname from student ?????where NOT exists
显示全部
相似文档