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;

将sc用SId字段自关联过程如下图

可见a表的第一行SId和b表的前三行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表中的06号SId和b表中的07号SId并不匹配呀。
第四步: 选出我们想要的字段。
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 ;

这篇博客介绍了如何通过SQL自关联查询来找出同时选修01课程和02课程的学生。首先确定查询的是成绩表,接着通过内连接将表自关联,筛选出SId匹配且课程编号分别为01和02的记录。最终的查询结果只包含5行,这是因为某些学生的01课程和02课程成绩没有匹配的SId。博客还详细解释了连接过程和结果出现的原因。
118

被折叠的 条评论
为什么被折叠?



