(二)
根据我去ebay面试的经历来看,它们比较看重的其实就是left join 的用法,缺失sql里面合并的用法很多,用法也很灵活,大家可以好好看看书上的介绍来理解一下。
简单分下类,join主要分为inner join 以及outer join
理解起来可以看inner join 是把匹配的列都放在一起,而outer join 会把部分不匹配的也放进来,放哪些进来就要看你的语句了;
举个例子来看;
select variable1, variable2 from a, b;
这样出来的是什么呢,这是笛卡尔积,简单来说把variable1中的所有行和variable2中的所有行一一对应,比如说a1,a2,a3 三行,b里面是b1,b2,b3三行,
结果就是a1,b1,a1,b2,a1,b3,a2,b1....变成了3*3九行;
但是,你在后面加上on对条件进行限制,那么这就变成了inner join,也就是只有满足条件的才会被提取,比如说
select variable1, variable2 from a, b on a.variable1=b.variable2; 这样就相当于对笛卡尔积进行了一个筛选;
left join select variable1, variable2 from a left join b on a.variable1=b.variable2; 这里出来的结果,a,variable1的结果都会有, 而variable2的匹配的才会出现;
right join 和上面刚好相反,只有b中的才会全部出现,a中的匹配的才会出现;
书中有图片来反映结果,我相信大家看了会更容易理解;
剩下的我说一下两个查询结果整合在一起;
union, except, intersect, outer union;
这四个合并方法都有两个选项可以使用 all 和 corr(corresponding)
all是把所有的结果都写出来,也就是说重复的不会合并,all不能与outer union合用;
corr 用在union, except, intersect三个中,只会输出合并的那一列,用在outer union 中,效果会比较好;
用书上的例子来说明一下吧;
table a;
x y
1 one
2 two
2 two
3 three
table b;
x z
1 one
2 two
4 four
1、union 会把两个查询结果合并在一起,相同的会合并,不同的就不会合并
select * from a
union
select * from b
结果:
x y
1 one
2 two
3 three
4 four
all:
select * from a
union all
select * from b
结果:
x y
1 one
2 two
2 two
3 three
1 one
2 two
4 four
corr:
select * from a
union corr
select * from b
结果:
x
1
2
3
4
except:只留下a中有b中没有的;
select * from a
except
select * from b
结果:
x y
3 three
all:
select * from a
except all
select * from b
结果:
x y
2 two
3 three
intersect:只要ab中都有的;
例子我就不写了,大家应该能联想到吧
outer union: 和union有点相似,但是大家看了结果就会发现,加了corr后,outer union是最像set 语句的;
proc sql;
select * from a
outer corr
select * from b;quit;
大家可以自己试试结果是什么;
另外有一点不知道大家注意到没有,前面三个可是没有区分变量的哦, x y 与x z 是默认相同的哦,所以这种用法不是很灵活,大家要小心使用。
|