学生(学号,姓名,系别,年龄) 
课程(课程号,课程名,学时) 
选读(学号,课程号,成绩) 
问题:检索选读全部课程的学生姓名 
select 学生.姓名
from 学生 
where not exists( select *
                  from 课程 
                     where not exists( select * 
                                    from 选读 
                                          where 学号=学生.学号 and 课程号=课程.课程号));
这个怎么理解,怎么单独运行 select * 
                    from 选读 
                       where 学号=学生.学号 and 课程号=课程.课程号
得不出什么结果?

解决方案 »

  1.   

    select *
                        from 选读
                          where 学号=学生.学号 and 课程号=课程.课程号 
    不认识学生和课程两个表的
      

  2.   

    得了解下sql是怎么运行计算的
      

  3.   

    这个怎么理解,怎么单独运行 select * 
                        from 选读 
                          where 学号=学生.学号 and 课程号=课程.课程号 
    得不出什么结果? 
    改为:
     select * 
                        from 选读 ,学生,课程
                          where 学号=学生.学号 and 课程号=课程.课程号 
    应该就有结果了
      

  4.   

    select * 
                        from 选读 ,课程,学生
                          where 选读.学号=学生.学号 and 学生.课程号=课程.课程号 
      

  5.   

    对exists 跟not exists 的理解不够啊。
    select 学生.姓名 
    from 学生 
    where not exists( select * 
                      from 课程 
                        where not exists( select * 
                                        from 选读 
                                              where 学号=学生.学号 and 课程号=课程.课程号)); 
    这是一整条的查询语句,不能把里面的拆出来用的。
    拆出来的话,学生表、课程表,对于选课表来说就是不可见的了。如果不是很清楚,可以查下SQL的帮助文档里面关于EXISTS与NOT EXISTS的用法。
    使用 EXISTS 和 NOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差集。两个集合的交集包含同时属于两个原集合的所有元素。差集包含只属于两个集合中的第一个集合的元素。
      

  6.   

    不经意间翻到这个帖子,贴一下我的答案,请指教。
    SELECT a.学号, count(a.课程号)
    FROM  AS 选读 a
    GROUP BY a.学号
    HAVING count(a.课程号)  = (select count(*) from 课程 b) and  
    exists (select * from 学生 c where a.学号 = c.学号);
      

  7.   

    学生姓名忘记取出来了。select c.姓名 from 学生 c inner join  
    (
    SELECT a.学号, count(a.课程号)
    FROM AS 选读 a
    GROUP BY a.学号
    HAVING count(a.课程号) = (select count(*) from 课程 b)
    ) new  on c.学号 = new.学号