Question09-查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

问题分析

  • 这个问题主要在于确定一个条件之后,怎么再指定一个条件,如果思维还仅仅停留在单表和基础的连接表操作,那么这题会显地比较难

  • 不过要说简单也其实很简单,只需要学会对问题进行简单的拆分即可,如下所示

    • -- 学过01,且学过02
      -- 学过01
      SELECT sc.`SID` FROM SC sc WHERE sc.`CID` = '01';
      -- 学过02
      SELECT sc.`SID` FROM SC sc WHERE sc.`CID` = '02';
      -- 连起来
      SELECT stu.* FROM Student stu, SC sc
      WHERE stu.`SID` = sc.`SID` AND sc.`CID` = '01'
      AND sc.`SID` IN (
      SELECT sc.`SID` FROM SC sc WHERE sc.`CID` = '02'
      )
  • 分析结束,接下来就是完善SQL

方法1

  • where连接

    • SELECT stu.* FROM Student stu, SC sca
      WHERE
      stu.`SID` = sca.`SID` AND sca.`CID` = '01'
      AND stu.`SID` IN (
      SELECT scb.`SID` FROM SC scb
      WHERE
      scb.`SID` = sca.`SID` -- 虽然不指定也能查出来数据,但是还是指定比较符合题意
      AND scb.`CID` = '02'
      );
    • left join on连接

      • SELECT stu.* FROM Student stu
        LEFT JOIN SC sca ON stu.`SID` = sca.`SID` AND sca.`CID` = '01'
        WHERE stu.`SID` IN
        (
        SELECT scb.`SID` FROM SC scb
        WHERE
        scb.`SID` = sca.`SID`
        AND scb.`CID` = '02'
        );
  • 查询结果如下所示

方法2

  • 左外连接

  • where做表连接

    • SELECT stu.* FROM Student stu, SC sca
      WHERE
      stu.`SID` = sca.`SID` AND sca.`CID` = '01'
      AND EXISTS (
      SELECT 1 FROM SC scb
      WHERE
      scb.`SID` = sca.`SID`
      AND scb.`CID` = '02'
      );
  • 查询结果如下所示

posted @   OnlyOnYourself-Lzw  阅读(649)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示