如何理解exists sql

  s(s#,sname,age,sex)  
  sc(s#,c#,grade)  
  c(c#,cname,teacher)  
  select   sname   from   s   where   not   exists   (  
  select   *   from   c   where   not   exists(  
  select   *   from   sc   where   sc.s#=s.s#   and   sc.c#=c.c#)   )

 

exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。not exists则相反。

exists做为where 条件时,是先对where 前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出。

上面这个列子,先查询出s表的结果,然后将结果代入到s.s#,然后再查询出c表中的结果,再一条一条的代入,感觉有点像for的嵌套循环,第一轮外循环中,满足内部的not exists条件的c表中的结果集被保留,然后再判断外部的not exists,这次判断是根据内部C表中被保留的结果集的情况,如果结果集为空,则输出当前这一条S表的结果集;然后再进行第二轮大的循环,即取出s表的第二条结果代入运算。

以上的sql还可以这样理解,最内部的  select   *   from   sc   where   sc.s#=s.s#   and   sc.c#=c.c#是查询出所有已经选择过课程的学生及相应课程,  select   *   from   c   where   not   exists则是所有没有被选择的课程,在这个基础上的  select   sname   from   s   where   not   exists 则是选取所有没有未选择课程的学生,即选择了所有课程的学员名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值