Student(S#,Sname,Sage,Ssex) 学生表 
Course(C#,Cname,T#) 课程表 
SC(S#,C#,score) 成绩表 14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名; 
    select S# from SC where C# in (select C# from SC where S#='1002') 
    group by S# having count(*)=(select count(*) from SC where S#='1002'); 1.我想知道这个查询是什么执行的(我的理解:先执行where C# in (select C# from SC where S#='1002') 选择符合条件的元组,再group by S#,然后having count(*)=(select count(*) from SC where S#='1002')?
2.我感觉这个查询有些不符合题意,如果有个同学的课程和“1002”号的同学学习的课程相同,并且多修了“1002”号的同学没修的其他课程,这样的同学也在查询结果里?

解决方案 »

  1.   


    1.
    /*
    SQL查询语句完整的执行顺序: 
    1、from子句组装来自不同数据源的数据; 
    2、where子句基于指定的条件对记录行进行筛选; 
    3、group by子句将数据划分为多个分组; 
    4、使用聚集函数进行计算; 
    5、使用having子句筛选分组; 
    6、计算所有的表达式; 
    7、使用order by对结果集进行排序。
    */2.
    题目本身出的就有问题,他这个问题必须大家都是1门课,如果可以多门就会出现你说的情况
    另外group by S# having count(*)=(select count(*) from SC where S#='1002')
    这句完全是废话,可以去掉LZ不要重复发帖!
      

  2.   

    前面一个in 子查询,保证了 1002 所课的课程这个S#也修了.
    后面一个子查询,保证了1002修的课程数与这个S#所修的一样.
    如果1002没修的他修了,那总数就会多出来.
      

  3.   

    http://topic.csdn.net/u/20100517/17/b2ab9d5e-73a2-4f54-a7ec-40a5eabd8621.html?89116
      

  4.   

    having count(*)=(select count(*) from SC where S#='1002'去看看相关子查询和无关子查询的区别
      

  5.   

    SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; 
    2、where子句基于指定的条件对记录行进行筛选; 
    3、group by子句将数据划分为多个分组; 
    4、使用聚集函数进行计算; 
    5、使用having子句筛选分组; 
    6、计算所有的表达式; 
    7、使用order by对结果集进行排序。 
    另外:一个查询语句各个部分的执行顺序: 
    --8)  SELECT (9) DISTINCT (11) <TOP_specification> <select_list> 
    --(1)  FROM <left_table> 
    --(3)    <join_type> JOIN <right_table> 
    --(2)      ON <join_condition> 
    --(4)  WHERE <where_condition> 
    --(5)  GROUP BY <group_by_list> 
    --(6)  WITH {CUBE | ROLLUP} 
    --(7)  HAVING <having_condition> 
    --(10) ORDER BY <order_by_list> 
      

  6.   

     正确
    还有having后面写的没有必要 
      

  7.   

    这个题目的语句写的不对;
    可以这样写:
    SELECT X.S#
    FROM SC X
    WHERE NOT EXISTS(
    SELECT *
    FROM SC Y
    WHERE Y.S#='1002' AND NOT EXISTS(SELECT * FROM SC Z WHERE Z.S#=X.S# AND Z.C#=Y.C#))
    GROUP BY X.S# HAVING COUNT(DISTINCT X.C#)=(SELECT COUNT(C#) FROM SC WHERE S#='1002')