oracle的左右连接语句

工作以来,碰到的第一个oracle区别于sql server的地方,就是oracle的左右连接语句。

这东西,还是举个栗子来形容比较形象。一个用户表users(user_id,address),手机号码表msisdns(user_id,msisdn)。对于每一个用户,用户表都有对应的ID对应,但并不是每个用户都有手机号,因此,在手机号码表并不一定有记录。那我们先看下面的语句。

select u.address, m.msisdn

from users u, msisdns m

where u.user_id = m.user_id

;

很明显,我们是在查找用户的地址和手机号码,但这里,我们加了一个限制(u.user_id = m.user_id),这会出现什么情况呢?比如:

users

user_id address
1 北区
2 南区

msisdns

user_id msisdn
1 1580601****
null null

这样,我们执行完语句,得到的只有一条记录

北区,1580601****

但,这有时会不符合我们的要求,我们需要的是每个用户的地址和手机号码,即使没有手机号码,也必须把地址显示出来。那要怎么办呢?接下来,我们对语句进行改造。

select u.address, m.msisdn

from users u, msisdns m

where u.user_id = m.user_id(+)

;

在msisdns表的user_id加上(+),这叫做左连接。我们来看结果。

北区,1580601****

南区,null

嗯,这就是我们想要的结果,南区这位用户,没有手机号码,但我们还是得到了他的地址。

我们来分析一下,左连接,确切地说,就是将右表存在的与左表进行关联,右表不存在的、左表存在的情况下,左表的值默认与右表的空记录进行关联。反之,右连接(u.user_id(+) = m.user_id),就是将左表存在的与右表进行关联,左表不存在的、右表存在的情况下,右表的值默认与左表的空记录进行关联。可能讲得有些混了,我们来翻译一下这句左连接语句。

select u.address, (select m.msisdn from msisdns m where u.user_id = m.user_id)

from users u

;

可以看出,这里会把每行users表的地址记录都输出来,然后根据users的user_id,去找msisdns表中对应的user_id,若没有,则会以null输出。

南区,null

因此,左连接就是保留左表,并尽量和右表关联,没有对应的记录,以null代替。右连接反之亦然。

 

Ps:本章我们提到的null,实质在数据库中输出来的是空,即空记录,这里用null来形象表示。在这里,感谢太子爷LZW的技术支持。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/poduoduopo/article/details/6882283
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭