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 ;