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 ;