zoukankan      html  css  js  c++  java
  • 50个查询系列-第五个查询:查询没学过“叶平”老师课的同学的学号、姓名;

    查询没学过“叶平”老师课的同学的学号、姓名:

    我们反着来 !不是要查没上过课的同学的名字吗。我们先查上叶平的课的学生。

    思路:

    1.先去查叶平上的课的课程id:

    SELECT t1.courseid kid FROM tblcourse t1,
    (SELECT  tblteacher.TeaId tid FROM tblteacher WHERE tblteacher.TeaName='叶平') t2
      WHERE t1.teaid=t2.tid -- 查出来叶平老师上的课的课程id

    结果是:

    2;去成绩表中(tblscore)查有这个课程id的学生。

      SELECT tblscore.StuId
      
      FROM 
      tblscore,
      ( SELECT t1.courseid kid FROM tblcourse t1,
    (SELECT  tblteacher.TeaId tid FROM tblteacher WHERE tblteacher.TeaName='叶平') t2
      WHERE t1.teaid=t2.tid) ykid-- 查出来叶平老师上的课的课程id
      
      WHERE tblscore.CourseId=ykid.kid 

    结果如下:

    我们可以看到上面的结果中有两个1013,这是因为这个学生有两门课都是叶平的课在查询时就查出来了。

    我当时就很纠结,怎么才能把重复结果去掉呢。就一个1013好了。

    后来我看了答案。答案也是这样的,两个1013

    后来我对啊。我们最后查出来要的是不在这个列表里面的学生的id啊,那么这个列表里有几个重复的学生其实是没有关系的。

    所以最后的写法就是:

    SELECT 
      *
      
      FROM
     
       tblstudent
       WHERE 
       tblstudent.StuId
       NOT IN
       (
     
      SELECT tblscore.StuId
      
      FROM 
      tblscore,
      ( SELECT t1.courseid kid FROM tblcourse t1,
    (SELECT  tblteacher.TeaId tid FROM tblteacher WHERE tblteacher.TeaName='叶平') t2
      WHERE t1.teaid=t2.tid) ykid-- 查出来叶平老师上的课的课程id
      
      WHERE tblscore.CourseId=ykid.kid 
      
      
      )
      
      
      
      

    查询结果:

    答案的写法是:

     SELECT StuId,StuName FROM tblStudent
      WHERE StuId NOT IN
       (
        SELECT StuID FROM tblScore sc
         INNER JOIN tblCourse cu ON sc.CourseId=cu.CourseId
         INNER JOIN tblTeacher tc ON cu.TeaId=tc.TeaId    
          WHERE tc.TeaName='叶平'
       )

    扩展:

    上面说到了重复记录怎么去除呢:用函数distinct

     SELECT 
      DISTINCT(t11.idd)
      FROM 
        
      (SELECT tblscore.StuId idd
      
      FROM 
      tblscore,
      ( SELECT t1.courseid kid FROM tblcourse t1,
    (SELECT  tblteacher.TeaId tid FROM tblteacher WHERE tblteacher.TeaName='叶平') t2
      WHERE t1.teaid=t2.tid) ykid-- 查出来叶平老师上的课的课程id
      
      WHERE tblscore.CourseId=ykid.kid )t11
      

    结果:

     就一个1013了。没有重复记录了。

  • 相关阅读:
    # 机器学习算法总结-第七天(线性回归)
    # 机器学习算法总结-第六天(Adaboost算法)
    # 机器学习算法总结-第五天(降维算法PCA/SVD)
    #再谈 CVE-2017-10271回显POC构造
    # 机器学习算法总结-第四天(SKlearn/数据处理and特征工程)
    # 机器学习算法总结-第三天(支持向量机)
    # 机器学习算法总结-第二天(朴素贝叶斯、逻辑回归)
    # 机器学习算法总结-第一天(KNN、决策树)
    # weblogic CVE-2019-2615/2618(任意文件读取,任意文件上传)
    # CVE-2019-2725二次反序列化EventData Gadget POC/JdbcRowSetImpl POC构造
  • 原文地址:https://www.cnblogs.com/shenxiaoquan/p/6115347.html
Copyright © 2011-2022 走看看