练习1.1:自关联查询

1.1 查询同时存在" 01 “课程和” 02 "课程的情况

关键词分析:01课程,02课程

第一步: 确定要查询的表为成绩表,因为成绩表中包含了课程编号和成绩,题目的意思就是要我们把一个学生的01课程成绩和02课程成绩放在同一行
在这里插入图片描述
第二步:sc表进行自关联查询便可以让01课程和02课程出现在同一行了

SELECT * FROM sc a INNER JOIN sc b ON a.`SId` = b.`SId`;

在这里插入图片描述
续上图
在这里插入图片描述

为了更好的理解关联查询,所以这里解释一下为什么结果是48行,我们先看一下成绩表自身有多少行记录。

SELECT * FROM SC;

在这里插入图片描述
scSId字段自关联过程如下图
在这里插入图片描述
可见a表的第一行SIdb表的前三行SId相同,会组合出三条记录,图中蓝色线所示,同理a表的第二行、第三行也会分别与b表的前三行组合出三条记录,如红色和绿色线所示。因此连接01号学生SId会出现9条记录。以此类推其他SId连接时的组合会得到最终有3×3+3×3+3×3+3×3+2×2+2×2+2×2=48

第三步: 回到题目,题目要求只要01课程和02课程出现在同一行就行了,那我们可以选择让a表只有01课程,b表只有02课程,然后关联即可。

SELECT 
  * 
FROM
  sc a 
  INNER JOIN sc b 
    ON a.`SId` = b.`SId` 
    AND a.CId = 01 
    AND b.`CId` = 02 ;

在这里插入图片描述
可以看到只有5行记录,这五行记录怎么来的呢,过程如下图
在这里插入图片描述
我们发现上图中a表和b表都有6行,但是连接后的结果是5行,是因为a表中的06SIdb表中的07SId并不匹配呀。

第四步: 选出我们想要的字段。

SELECT 
  a.*,
  b.`CId`,
  b.`score`
FROM
  sc a 
  INNER JOIN sc b 
    ON a.`SId` = b.`SId` 
    AND a.CId = 01 
    AND b.`CId` = 02 ;

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值