工作以来,碰到的第一个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的技术支持。
oracle的左右连接语句
最新推荐文章于 2023-12-01 17:51:10 发布