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/ 本文版权归风云和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    透视分析
    仪表分析
    sql查询和预览界面,在预览界面选择图表最后进行导出数据和图表到excel
    可视化查询
    创建数据源
    Smartbi使用Oracle RAC数据库做知识库
    反应器(Reactor)模式
    Netty:EventLoopGroup
    ShuffleTest java 使用集合的方式进行排序
    MapTest java 核心编程
  • 原文地址:https://www.cnblogs.com/fengyunlishi/p/2730051.html
Copyright © 2011-2022 走看看