练习1.2:左外连接与内连接的区别,连接时条件写在on和where中的差异,需要注意!!!

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 ;

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值