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_idaddress
1北区
2南区

msisdns

user_idmsisdn
11580601****
nullnull

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

北区,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的技术支持。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值