zoukankan      html  css  js  c++  java
  • 50个查询系列-第六个查询:查询学过“001”并且也学过编号“002”课程的同学的学号、姓名

    查询学过“001”并且也学过编号“002”课程的同学的学号、姓名:

    我的写法:

    第一步:先查出来学过“001”并且也学过编号“002”课程的同学的学号:

    SELECT t11.t1sid t33id
    FROM 
    (SELECT t1.StuId t1sid FROM tblscore t1 WHERE t1.CourseId='001')t11,-- 001的学生的id
    (SELECT t1.StuId  t2sid FROM tblscore t1 WHERE t1.CourseId='002')t22-- 002的学生的id
    WHERE 
    t11.t1sid=t22.t2sid

    查询的结果是:

    第二步:根据查出来的学生的id去查学生的姓名,学号

    SELECT 
    tblstudent.StuId,tblstudent.StuName
    FROM
    (
    SELECT t11.t1sid t33id
    FROM 
    (SELECT t1.StuId t1sid FROM tblscore t1 WHERE t1.CourseId='001')t11,-- 001的学生的id
    (SELECT t1.StuId  t2sid FROM tblscore t1 WHERE t1.CourseId='002')t22-- 002的学生的id
    WHERE 
    t11.t1sid=t22.t2sid
    )t33-- 查出来的是学过“001”并且也学过编号“002”课程的同学的学号
    ,
    tblstudent
    WHERE tblstudent.StuId=t33.t33id

    查询结果:

    答案的写法是:

     SELECT StuId,StuName FROM tblStudent st
      WHERE (SELECT COUNT(*) FROM tblScore s1 WHERE s1.StuId=st.StuId AND s1.CourseId='001')>0
       AND
       (SELECT COUNT(*) FROM tblScore s2 WHERE s2.StuId=st.StuId AND s2.CourseId='002')>0

    我们看一些这个写法:

    他的主表是学生表(tblstudent)

    SELECT COUNT(*) FROM tblScore s1 WHERE s1.StuId=st.StuId AND s1.CourseId='001'
    这句话是说遍历tblstudent的每一条数据和tblscore里面的每一条数据,要求tblstudent的stuid和tblscore的数据一致:
    这么一来的话候选项是:

    然后

    s1.CourseId='001'这么一来的话:就只剩一条数据了。
    如果满足
    (SELECT COUNT(*) FROM tblScore s1 WHERE s1.StuId=st.StuId AND s1.CourseId='001')>0能查询出来的话就表示满足学过001的课程。
    同理
    (SELECT COUNT(*) FROM tblScore s2 WHERE s2.StuId=st.StuId AND s2.CourseId='002')>0能查询出来的话就表示满足学过002的课程。

    同时满足这两个条件的学生就是同时上过两门课的学生。




  • 相关阅读:
    selet 语句详解
    第三章 sql 的约束
    第二章 创建数据库并插入数据
    第一章
    微信小程序(九)
    微信小程序(七)
    微信小程序(八)
    微信小程序(六)
    bzoj4622 [NOI 2003] 智破连环阵
    bzoj3996 [TJOI2015]线性代数
  • 原文地址:https://www.cnblogs.com/shenxiaoquan/p/6115563.html
Copyright © 2011-2022 走看看