oracle的左右連線語句

2021-06-01 00:56:39 字數 1449 閱讀 3663

工作以來,碰到的第乙個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

address1北區

2南區msisdns

user_id

msisdn

11580601****

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 左右連線

在oracle pl sql中,左連線和右連線以如下方式來實現 檢視如下語句 select emp name,dept name form employee,department where employee.emp deptid department.deptid此sql文使用了右連線,即 所在位...

oracle左右連線

create table test.test1 a int,b int create table test.test2 a int,b int insert into test.test1 values 1,456 insert into test.test1 values 2,427 insert...

oracle左右連線

左連線左邊的表資料應該是全的,應該是主表,有鏈結應該是右邊的表是全的是主表 因此記為 左連線左全,右連線右全。看下面的例項 create table student id number,name varchar2 20 create table score sid number,score numb...