查询和“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/

本文版权归风云和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

 

转载于:https://www.cnblogs.com/fengyunlishi/archive/2012/10/18/2730051.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值