Question01-查询"01"课程比"02"课程成绩高的学生的信息及课程分数

提前声明,鄙人只是一名刚入门的小白,一切随笔都有不足,望海涵!

问题

  • 查询"01"课程比"02"课程成绩高的学生的信息及课程分数

  • 分析

    • 碰到这个问题,不难想到"01"和"02"课程的成绩存储在SC表,那要如何找到切入点呢?
    • 数据库中的数据如下所示
    • 这个题目的难点个人认为就是初学者刚开始很难想到一张表可以在一句SQL中查两次!
    • 这也是本题的关键,因为CID字段必须要单独分出来,查询到指定的分数,才能将分数进行对比
    • 如果还没理解,请看接下来的解题SQL即可

SQL示例

  • where做连接查询

    • SELECT 
      	a.*, 
      	b.score 01课程成绩,
      	c.score 02课程成绩 
      FROM
      	Student a , SC b , SC c
      WHERE 
        a.SID = b.SID 
        AND a.SID = c.SID 
        AND b.CID = '01' 
        AND c.CID = '02' 
        AND b.score > c.score
      
  • 左外连接查询

    • SELECT 
      	stu.*, 
      	sca.score 01课程成绩, 
      	scb.score 02课程成绩 
      FROM 
      	Student stu
      LEFT JOIN SC sca ON sca.SID = stu.SID AND sca.CID = 01
      LEFT JOIN SC scb ON scb.SID = stu.SID AND scb.CID = 02
      WHERE sca.score > scb.score;
      
  • 上面两种查询都可以正确查询到数据,如下所示

  • 至于where做表连接和 join 做表连接的区别,个人觉得,简单的表连接where可以做,但是到某一些复杂的操作则必须使用 join连接才可以,且当数据量变大的时候,join效率会更高

    • 具体的区别可以自行百度查询资料
  • 同时鄙人也觉得 join 连接的SQL理解起来更为通俗易懂

补充

  • 刚才的思路是查询同时存在"01"课程和"02"课程的情况

  • 但是其实还有一种思路查询同时存在"01"课程和"02"课程的情况和存在"01"课程,但可能不存在"02"课程的情况(不存在时显示为null)

  • 这时候就需要用到MySQL的IFNULL(a, b)函数了,作用是如果a为空,则取b的值

  • SQL语句跟上面的基本相同,如下所示

    • SELECT 
      	stu.*, 
      	sca.score 01课程成绩, 
      	IFNULL(scb.score, 0) 02课程成绩 
      FROM 
      	Student stu
      LEFT JOIN SC sca ON sca.SID = stu.SID AND sca.CID = 01
      LEFT JOIN SC scb ON scb.SID = stu.SID AND scb.CID = 02
      WHERE sca.score > IFNULL(scb.score, 0);
      
    • 结果如下所示(吴兰02课程那里应该是0,之前有点小问题)

posted @ 2022-08-09 18:39  OnlyOnYourself-Lzw  阅读(316)  评论(0编辑  收藏  举报