根据数据库理论, 第一张表如果有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
以第一表为基础表,和第二表进行连接,如果内连接,则无记录.如果是左连接,则以第一表为准.
是这个样子的,这个笛卡尔,是取最少纪录,不存在空集