1.2 查询存在" 01 “课程但可能不存在” 02 "课程的情况(不存在时显示为 null )
分析:乍一看,和练习1.1:自关联查询很相似,把内连接改成左外连接就行了
单纯把练习1.1中内连接改为左外连接,结果如下:
SELECT
a.*,
b.`CId`,
b.`score`
FROM
sc a
LEFT JOIN sc b
ON a.`SId` = b.`SId`
AND a.CId = 01
AND b.`CId` = 02 ;

为什么会出现上图的情况呢?
原因很简单,我们都知道左外连接时,则左表的所有数据是都会出现的,即左连接的特点是:左边必须有,右边可有可无。这也是一个需要我们特别注意的地方,因此这里a.CId = 01写在了连接条件中是错误的(如果是内连接的话就没事,因为内连接保留的就是左右表都有的记录),因为该条件在连接的时候确实生效了,即只将符合ON a.SId = b.SId AND a.CId = 01 AND b.CId = 02 条件的记录进行了连接,但是最终保存结果的时候,由于是left join,所以左表的全部记录都是会查出来的。正确的做法是让两表连接之后,用where条件选出a.CId = 01的记录。如下:
SELECT
a.*,
b.`CId`,
b.`score`
FROM
sc a
LEFT JOIN sc b
ON a.`SId` = b.`SId`
AND b.`CId` = 02
WHERE a.cid = 01 ;

本文解析了在进行自关联查询时,为何单纯将内连接改为左外连接会导致查询结果异常。重点在于理解左连接的特性——左表所有数据都会出现,连接条件需调整。正确做法是在连接后用WHERE筛选a.CId=01的记录。

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



