select 姓名
from xs where  not exists
(
select * from kc  
 where not exists
   (
    select * from xs_kc
where 学号=xs.学号 and 课程号=kc.课程号
   )
)
/*查找选修全部课程的学生姓名 */有3个表 xs, kc,xs_kc
 
请问具体的处理过程是怎么样的呢 谢谢 可以的话请说出开始到结束的过程

解决方案 »

  1.   

    相关子查询(也称为重复子查询)许多查询都可以通过执行一次子查询并将结果值代入外部查询的 WHERE 子句进行评估。
    在包括相关子查询(也称为重复子查询)的查询中,子查询依靠外部查询获得值。
    这意味着子查询是重复执行的,为外部查询可能选择的每一行均执行一次。下面的查询查找获得某本书 100 % 共享版税 (royaltyper) 的所有作者名。USE pubs
    SELECT au_lname, au_fname
    FROM authors a
    WHERE 100 IN
       (SELECT royaltyper
       FROM titleauthor
       WHERE titleauthor.au_ID = a.au_id)下面是结果集:au_lname                                 au_fname             
    ---------------------------------------- -------------------- 
    White                                    Johnson              
    Green                                    Marjorie             
    Carson                                   Cheryl               
    Straight                                 Dean                 
    Locksley                                 Charlene             
    Blotchet-Halls                           Reginald             
    del Castillo                             Innes                
    Panteley                                 Sylvia               
    Ringer                                   Albert               (9 row(s) affected)与以前提到的大多数子查询不同,该语句中的子查询无法独立于主查询而得到解决。
    该子查询需要一个 authors.au_id 值,而该值是个变量,随 Microsoft SQL Server 
    检查 authors 表中的不同行而更改。下面准确说明如何评估该查询:SQL Server 考虑 authors 表中的每一行是否都包括在结果中,
    方法是将每一行的值都代入内部查询中。例如,如果 SQL Server 首先检查 Cheryl Carson 行,
    那么变量 authors.au_id 将取值 238-95-7766,SQL Server 将该值代入到内部查询中。USE pubs
    SELECT royaltyper
    FROM titleauthor
    WHERE au_id = '238-95-7766'结果为 100,所以外部查询评估为:USE pubs
    SELECT au_lname, au_fname
    FROM authors
    WHERE 100 IN (100)由于这是真的,因此 Cheryl Carson 行包括在结果中。对 Abraham Bennet 行运行相同的过程,会发现该行没有包括在结果中。
    ---------------------------------------------------------------------------------------------------举个例子;
    SELECT t1.type
    FROM titles t1
    GROUP BY t1.type
    HAVING MAX(t1.advance) >=ALL
    (SELECT 2 * AVG(t2.advance)
    FROM titles t2
    WHERE t1.type = t2.type)
    这个结果返回最高预付款超过给定组中平均预付款两倍的书籍类型。
    -----------------------------------------------------------------------再举个例子:
    要求返回每一个编号的最大值(列出id,name,score)
    ID Name(编号) Score(分数)
    1 a 88
    2 b 76
    3 c 66
    4 c 90
    5 b 77
    6 a 56
    7 b 77 
    8 c 67
    9 a 44
    select * from t a where score=
    (select Max(Score) from t b where a.name=b.name)
    ------------------------------------------------------------------再给一个排位的sql语句
    SELECT 
    ( SELECT count(*)+1 as dd FROM [Test ] as a where a.[F2]<b.[F2] ) AS ord,
    b.[F1], b.[F2] 
    FROM [Test ] as b 
    order by b.[F2];相关子查询与普通子查询的区别在于:相关子查询引用了外部查询中的列!这种用外部查询来限制子查询的方法使
    SQL查询变得更加强大和灵活。因为相关子查询能够引用外部查询,所以它们尤其适合编写复杂的where条件!
    相关子查询不能自己单独运行,其执行顺序如下:
    1.首先执行一次外部查询
    2.对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当前行的值。
    3.使用子查询的结果来确定外部查询的结果集
      

  2.   

    此语句使用了双重否定为肯定式,可以这样理解: 
      1.选择学生姓名
      2.不存在一个学生
      3.有门课程没有选修的Select 姓名       -- 1
    from xs where  not existsv   --2 
    ( select * from kc  
       where not exists          --3  
       ( select * from xs_kc
         where 学号=xs.学号 and 课程号=kc.课程号
       )
    )
      

  3.   

    这个,楼主可以先理解一层的exists
    然后再理解两层的刚才试着写了一下
    发现很难表述清楚
      

  4.   

    xs
    张三
    李四kc
    数学
    语文
    英语xs_kc 
    张三 数学
    张三 英语
    李四 数学
    李四 语文
    李四 英语从xs表里查询的第一层exists ,我们可以这样理解:
    对于xs表的每一条数据,都要来判断是否满足括弧里面的条件
    假设先取张三
    然后看里面这层,kc表也要进行筛选,那我们也可以认为是每条数据都要来判断
    假设取数学那这个时候在xs_kc里查询,发现有一条数据满足学号=xs.学号(张三)、课程号=kc.课程号(数学)
    那这个时候对于里面的这层查询来讲,数学就不符合条件了,
    那再看语文
    这个时候xs_kc 里不存在满足学号=xs.学号(张三)、课程号=kc.课程号(语文)的纪录
    那语文就满足了内层连接的条件
    实际上语文正是张三没有选的课程
    当内层连接有数据返回的时候,第一层的数据就不符合条件了,因为是not exists ,
    所以张三就不符合条件同理,李四是符合条件的
    所以这个语句的结果是李四
      

  5.   

    --楼主这样能理解吗?select * from xs        --4:符合条件的基本信息
    where 学号 in
    (
    select 学号 from           --3:符合的学号
    (
    select 学号,count(课程号) as 课程号数 from xs_kc  --1:处理学号和科目的对应数
    group by 学号
    ) tb
    where 课程号数=(select count(1) from kc) --2:应该选择的科目数
    )
      

  6.   

    谢谢各位 有大侠补充那个not exists和相关子查询不?
      

  7.   

    其实要理解也很简单,两个not exists双重否定=肯定
    为什么不用exists呢,因为要全部课程,用exists只能选择部分课程