Join-随笔(2)

Outer Join和Inner Join的区别就在于未匹配行在结果集中的出现情况.
标准语法格式如下:
--left table -- LEFT --------------- JOIN -- right table -- ON -- join_condition
             |_ RIGHT_||_ OUTER _|
             |_ FULL _|
也就是说,
<1>outer有时候可以省略;
<2>对于外关联,只有on子句里面才是关联条件;
<3>A left join B等同于B right join A
在没有任何where子句的情况下,A left join B的结果集的记录数永远是
A表中的记录行数,这一点从维恩图中很容易就看出来.

外联结的操作性不象内联结那样可交换性, A left join B和B left join A
是完全不同的含义.所以大多数情况下,数据库的优化器通常会严格按照SQL
的代码书写顺序来依次进行Join操作. 在写多表外联结的时候就要
小心,保证最终出来的结果符合你的语义需求.
On子句的位置往往决定了Join的先后次序. 我只提供参考标准,
但很可能不同数据库的策略是不同的,所以大家有兴趣可以自己试试看看
实际的结果. (下面的举例都是在语句中不出现圆括号而改变优先级情况下)
<1>在SQL中的第一个On子句(自左向右)首先生效.
<2>任何一个On子句都作用于其最直接的前导Join操作
呃,是不是看不大明白? 那就来看例子吧.

(1) Table_A
     left    outer join Table_B on join_condition_1
     right  outer join Table_C on join_condition_2;
(2) Table_A
     left    outer join Table_B
     right  outer join Table_C
     on join_condition_1
     on join_condition_2;
这两个查询含义相同么?结果一样么? Of cause not
例子1 是 A先left join B (join_condition1),其结果再和
          C right join (join_condidtion2)
例子2 是 B先和C right join(join_condition1) ,A再和
          其结果进行left join(join_condition2)

嗯,下面这个例子,有兴趣的朋友自己分析一下join的次序吧
(3) Table_A
     left    outer join Table_B on join_condition_1
     JOIN Table_C
     right  outer join Table_D on join_condition_2
     on join_condition3;
    
所以,为了避免因为书写顺序的不同而导致的结果大相径庭,对于
多表联结,
<1>可以用()来显著地标明操作优先级;
<2>尽可能地每个outer join后面紧跟on子句,不要把所有on子句
       堆叠到SQL的末尾;
      
ps 1.Join操作多表关联的数量在有些数据库是有限制的;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值