外连接的精髓(执行过程)

create table a (id int, name char(1))
insert into a
select 1,'a' union all
select 2,'b' union all
select 3,'c'

create table b (id int, name char(1))
insert into b
select 1,'a' union all
select 2,'b' union all
select 3,'c'

select   *   from   a   left   join   b   on   a.id=1
--
  left   join   嘛,   无非是左边表为基础,   扫描右边表匹配的记录  
  先是左边表的第1条记录  
  1         a        
  按条件   a.id=1,   来扫描右边表的记录  
  对于右边表的每条记录,   显然   a.id=1   这个条件都是成立的,   所以第1条记录匹配后的结果是:  
   
  1             a               1                 a  
  1             a               2                 b  
  1             a               3                 c  
  ---------------------------------------------  
  然后再扫描第2条记录  
  2           b  
  对于条件   a.id=1,   在边表中没有与之匹配的记录,   所以右边表为NULL  
  因此第2条记录匹配的结果为  
  2             b               NULL                 NULL 
  ----------------------------------------------  
  第3条记录与第2条记录一样,   匹配的结果是  
  3             c               NULL                 NULL  
  ---------------------------------------  
  因此最终结果是5条记录  
  1             a               1                 a  
  1             a               2                 b  
  1             a               3                 c  
  2             b               null           null  
  3             c               null           null    
总结:
        首先,left join 的执行是有顺序的
他先用左边的第一条记录来右边的进行比较,找出符合条件的(如果没有符合条件的,则用左边的作为查询结果的左半部分,右边用空null来填充),依次执行左边的每一条记录,直到最后一条用,将所有结果拼在一起

注意:左连接结果的行数最少为左表的行数

其次,在加如了where条件后,where不是连接查询语句的一部分,他是在做完连接查询以后在做的过滤,因此他可以将做完左外连接的数据再过滤

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

JL99000

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值