SQL 外连接的疑惑

根据数据库理论, 第一张表如果有m条记录, 第二张表有n条记录, 那么笛卡儿积之后, 应该有m*n条记录。 

现在有一张表A(id ,name), 有三条记录

id name
1 A
2 B
3 C



表B(id)没有记录。

执行 如下语句:

select * from A,B

返回0条记录, 符合数据库理论, 5*0=0

执行 如下 语句:

select A.id from A left outer join B 
on A.id=B.id

成功返回

A_id
1
2
3

这里我感到很疑惑, 数据库在表连接的时候, 总是先做笛卡儿积形成虚拟表VT1,然后在VT1的上再作筛选, 现在VT1很明显是空集, 为什么left outer join 能出结果?

谢谢啦~


OUT JOIN有分执行3个阶段
1:笛卡尔积:
2:ON筛选器
3:添加外部行
第3步会把2步过滤掉的A表的行重新添加回来。
所以楼主的机构就是A表的数据了

内部链接inner,执行前两个阶段笛卡尔积和ON筛选器

 

A left outer join B
不管B有没有记录,A的记录总是会有的,如果查询含B的列,则为NULL.

 

left outer join

以第一表为基础表,和第二表进行连接,如果内连接,则无记录.如果是左连接,则以第一表为准.

 

是这个样子的,这个笛卡尔,是取最少纪录,不存在空集

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值