查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
要求:
查询和“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');
这种写法属于没有理解SQL运行顺序,SQL先在数据库中运行where语句,然后才对结果进行group
所以假如有一个1001同学,1002选课时1001选课的真子集,上面这种写法则会输出1001,这是不对的。
正确答案:
select SC1.S# from (select S# from SC group by S# having count(*)=(select count(*) from SC where S#='1002')) SC1,SC where SC1.S#=SC.S# and C# in (select C# from SC where S#='1002')
先从数量上删除与1002选课数相同的同学,然后再进行in操作,此种写法是对上面错误写法的改进
select S# from SC where S# not in(select S# from SC where C# not in (select C# from SC where S#='1002')) group by S# having count(*)=(select count(*) from SC where S#='1002');(出自师妹之手)
利用双重否定来求解,这是一种更加方便简洁的写法,该方法才算是完全利用了in的逐一对比精要
作者: 风云
出处: http://www.cnblogs.com/fengyunlishi/
本文版权归风云和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.