zoukankan      html  css  js  c++  java
  • 查询和“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/

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

    作者: 风云 出处: http://www.cnblogs.com/fengyunlishi/ 本文版权归风云和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    mysql基础
    EM算法总结
    机器学习之PCA(1)
    C语言socket编程<二>
    计算机网络·实验一:
    机器学习之GMM-EM
    C语言socket编程<一>socket之Winsock API
    【翻译】java-TCP-socket网络编程2
    【翻译】java-TCP-socket网络编程1
    【翻译】Java IO 关系总览和整理
  • 原文地址:https://www.cnblogs.com/fengyunlishi/p/2730051.html
Copyright © 2011-2022 走看看