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

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
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值