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.
/*
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不要重复发帖!
后面一个子查询,保证了1002修的课程数与这个S#所修的一样.
如果1002没修的他修了,那总数就会多出来.
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>
还有having后面写的没有必要
可以这样写:
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')