日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle 表连接方式(内连接/外连接/自连接) 详解

發布時間:2025/3/21 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle 表连接方式(内连接/外连接/自连接) 详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Oracle?表之間的連接分為三種:

1.?內連接(自然連接)

2.?外連接

1左外連接?(左邊的表不加限制)
?????? (2)右外連接(右邊的表不加限制)
??????? (3)全外連接(左右兩表都不加限制)

3.?自連接(同一張表內的連接)

?

SQL的標準語法:
select?table1.column,table2.column
from?table1?[inner?|?left?|?right?|?full?]?join?table2?on?table1.column1?=?table2.column2;

inner?join?表示內連接;

left?join表示左外連接;

right?join表示右外連接;

full?join表示完全外連接;
on子句?用于指定連接條件。

注意:

如果使用from子句指定內、外連接,則必須要使用on子句指定連接條件
?????? 如果使用(+)操作符指定外連接,則必須使用where子句指定連接條件

?

?

?

?

一.?內連接(Inner?Join/Join

?

?

1.1??Inner?Join?

Inner?join邏輯運算符返回滿足第一個(頂端)輸入與第二個(底端)輸入聯接的每一行。這個和用select查詢多表是一樣的效果,所以內連接很少

還有一點要說明的就是Join?默認就是inner?join。?所以我們在寫內連接的時候可以省略inner?這個關鍵字。?

?

?

1.2?下面舉例來說明內連接:

1.2.1?先創建2張測試表并插入數據:

SQL>?select?*?from?dave;

ID? NAME

----------?----------

1? dave

2? bl

1? bl

2? dave

SQL>?select?*?from?bl;

ID? NAME

----------?----------

1? dave

2? bl

1.2.3?用內鏈接進行查詢:

SQL>?Select?a.id,a.name,b.name?from?dave?a?inner?join?bl?b?on?a.id=b.id;???--?標準寫法

????????ID?NAME???????NAME

----------?----------?----------

?????????1?dave???????dave

?????????2?bl?????????bl

?????????1?bl?????????dave

?????????2?dave???????bl

SQL>?Select?a.id,a.name,b.name?from?dave?a?join?bl?b?on?a.id=b.id;??--?這里省略了inner?關鍵字

????????ID?NAME???????NAME

----------?----------?----------

?????????1?dave???????dave

?????????2?bl?????????bl

?????????1?bl?????????dave

?????????2?dave???????bl

SQL>?Select?a.id,a.name,b.name?from?dave?a,bl?b?where?a.id=b.id;??--?select?多表查詢

????????ID?NAME???????NAME

----------?----------?----------

?????????1?dave???????dave

?????????2?bl?????????bl

?????????1?bl?????????dave

?????????2?dave???????bl

???從這三個SQL?的結果我們也可以看出,他們的作用是一樣的。

?

?

1.3?自然連接(Natural?join)

自然連接是在兩張表中尋找那些數據類型和列名都相同的字段,然后自動地將他們連接起來,并返回所有符合條件按的結果。

看一下自然連接的例子:

SQL>?Select?id,name?from?dave?a?natural?join?bl?b;??

????????ID?NAME

----------?----------

?????????1?dave

?????????2?bl

這里我們并沒有指定連接的條件,實際上oracle為我們自作主張的將,dave表中的id和name字段與bl中的id和name字段進行了連接。也就是實際上相當于

SQL>?Select?dave.id,bl.name?From?dave?join?bl?on?dave.id?=?bl.id?and?dave.name=bl.name;

????????ID?NAME

----------?----------

?????????1?dave

?????????2?bl

因此,我們也可以將自然連接理解為內連接的一種。?

?

?

有關自然連接的一些注意事項

1.如果做自然連接的兩個表的有多個字段都滿足有相同名稱個類型,那么他們會被作為自然連接的條件。

2.如果自然連接的兩個表僅是字段名稱相同,但數據類型不同,那么將會返回一個錯誤。

?

?

?

?

二.?外連接(Outer?Join)

outer?join則會返回每個滿足第一個(頂端)輸入與第二個(底端)輸入的聯接的行。它還返回任何在第二個輸入中沒有匹配行的第一個輸入中的行。外連接分為三種:?左外連接,右外連接,全外連接。?對應SQLLEFT/RIGHT/FULL?OUTER?JOIN?通常我們省略outer?這個關鍵字。?寫成:LEFT/RIGHT/FULL?JOIN

在左外連接和右外連接時都會以一張表為基表,該表的內容會全部顯示,然后加上兩張表匹配的內容。?如果基表的數據在另一張表沒有記錄。?那么在相關聯的結果集行中列顯示為空值(NULL)。?

?

?

對于外連接?可以使用“(+)?”來表示?關于使用(+)的一些注意事項:
1.+)操作符只能出現在where子句中,并且不能與outer?join語法同時使用。
2.?當使用(+)操作符執行外連接時,如果在where子句中包含有多個條件,則必須在所有條件中都包含(+)操作符
3.+)操作符只適用于列,而不能用在表達式上。
4.+)操作符不能與orin操作符一起使用。
5.+)操作符只能用于實現左外連接和右外連接,而不能用于實現完全外連接。

在做實驗之前,我們先將dave表和bl里加一些不同的數據。?以方便測試。?

SQL>?select?*?from?bl;

????????ID?NAME

----------?----------

?????????1?dave

?????????2?bl

?????????3?big?bird

?????????4?exc

?????????9?懷寧

SQL>?select?*?from?dave;

????????ID?NAME

----------?----------

?????????8?安慶

?????????1?dave

?????????2?bl

?????????1?bl

?????????2?dave

?????????3?dba

?????????4?sf-express

?????????5?dmm

?

?

2.1?左外連接(Left?outer?join/?left?join

?????left?join是以表的記錄為基礎的,示例中Dave可以看成左表,BL可以看成右表,它的結果集是Dave表中的數據,在加上Dave表和BL表匹配的數據。換句話說,左表(Dave)的記錄將會全部表示出來,而右表(BL)只會顯示符合搜索條件的記錄BL表記錄不足的地方均為NULL.

示例:

SQL>?select?*?from?dave?a?left?join?bl?b?on?a.id?=?b.id;

???????ID?NAME???????????????ID?NAME

---------?----------?----------?----------

????????1?bl??????????????????1?dave

????????1?dave????????????????1?dave

????????2?dave????????????????2?bl

????????2?bl??????????????????2?bl

????????3?dba?????????????????3?big?bird

????????4?sf-express??????????4?exc

????????5?dmm?????????????????????????????--?此處B表為null,因為沒有匹配到

????????8?安慶?????????????????????????????--?此處B表為null,因為沒有匹配到

SQL>?select?*?from?dave?a?left?outer?join?bl?b?on?a.id?=?b.id;

????????ID?NAME???????????????ID?NAME

----------?----------?----------?----------

?????????1?bl??????????????????1?dave

?????????1?dave????????????????1?dave

?????????2?dave????????????????2?bl

?????????2?bl??????????????????2?bl

?????????3?dba?????????????????3?big?bird

?????????4?sf-express??????????4?exc

?????????5?dmm

?????????8?安慶

?

?

用(+)來實現,?這個+號可以這樣來理解:?+?表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在右表,左表就是全部顯示,故是左連接。

SQL>?Select?*?from?dave?a,bl?b?where?a.id=b.id(+);????--?注意:?用(+)?就要用關鍵字where

????????ID?NAME???????????????ID?NAME

----------?----------?----------?----------

?????????1?bl??????????????????1?dave

?????????1?dave????????????????1?dave

?????????2?dave????????????????2?bl

?????????2?bl??????????????????2?bl

?????????3?dba?????????????????3?big?bird

?????????4?sf-express??????????4?exc

?????????5?dmm

?????????8?安慶

?????

?

?

2.2?右外連接(right?outer?join/?right?join

和left?join的結果剛好相反,是以右表(BL)為基礎的,?顯示BL表的所以記錄,在加上DaveBL?匹配的結果。?Dave表不足的地方用NULL填充.

?

?

示例:

SQL>?select?*?from?dave?a?right?join?bl?b?on?a.id?=?b.id;

????????ID?NAME???????????????ID?NAME

----------?----------?----------?----------

?????????1?dave????????????????1?dave

?????????2?bl??????????????????2?bl

?????????1?bl??????????????????1?dave

?????????2?dave????????????????2?bl

?????????3?dba?????????????????3?big?bird

?????????4?sf-express??????????4?exc

???????????????????????????????9?懷寧????--此處左表不足用Null?填充

已選擇7行。

SQL>?select?*?from?dave?a?right?outer?join?bl?b?on?a.id?=?b.id;

????????ID?NAME???????????????ID?NAME

----------?----------?----------?----------

?????????1?dave????????????????1?dave

?????????2?bl??????????????????2?bl

?????????1?bl??????????????????1?dave

?????????2?dave????????????????2?bl

?????????3?dba?????????????????3?big?bird

?????????4?sf-express??????????4?exc

???????????????????????????????9?懷寧??--此處左表不足用Null?填充

已選擇7行。

?

用(+)來實現,?這個+號可以這樣來理解:?+?表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在左表,右表就是全部顯示,故是右連接。

SQL>?Select?*?from?dave?a,bl?b?where?a.id(+)=b.id;

????????ID?NAME???????????????ID?NAME

----------?----------?----------?----------

?????????1?dave????????????????1?dave

?????????2?bl??????????????????2?bl

?????????1?bl??????????????????1?dave

?????????2?dave????????????????2?bl

?????????3?dba?????????????????3?big?bird

?????????4?sf-express??????????4?exc

???????????????????????????????9?懷寧

?

?

2.3?全外連接(full?outer?join/?full?join

?????左表和右表都不做限制,所有的記錄都顯示,兩表不足的地方用null?填充。?全外連接不支持(+)這種寫法。

示例:

SQL>?select?*?from?dave?a?full?join?bl?b?on?a.id?=?b.id;

????????ID?NAME???????????????ID?NAME

----------?----------?----------?----------

?????????8?安慶

?????????1?dave????????????????1?dave

?????????2?bl??????????????????2?bl

?????????1?bl??????????????????1?dave

?????????2?dave????????????????2?bl

?????????3?dba?????????????????3?big?bird

?????????4?sf-express??????????4?exc

?????????5?dmm

???????????????????????????????9?懷寧

已選擇9行。

SQL>?select?*?from?dave?a?full?outer?join?bl?b?on?a.id?=?b.id;

????????ID?NAME???????????????ID?NAME

----------?----------?----------?----------

?????????8?安慶

?????????1?dave????????????????1?dave

?????????2?bl??????????????????2?bl

?????????1?bl??????????????????1?dave

?????????2?dave????????????????2?bl

?????????3?dba?????????????????3?big?bird

?????????4?sf-express??????????4?exc

?????????5?dmm

???????????????????????????????9?懷寧

已選擇9行。

?

三.?自連接

自連接(self?join)是SQL語句中經常要用的連接方式,使用自連接可以將自身表的一個鏡像當作另一個表來對待,從而能夠得到一些特殊的數據。

示例:

在oraclescottschema中有一個表是emp在emp中的每一個員工都有自己的mgr(經理),并且每一個經理自身也是公司的員工,自身也有自己的經理。

下面我們需要將每一個員工自己的名字和經理的名字都找出來。這時候我們該怎么做呢?

如果我們有兩張這樣的表分別教workermgr,那么我們就很好寫SQL語句。

Select?worker.name,

Mgr.name

From?worker,mgr

Where?worker.id?=?mgr.id;

?

但現在我們只有一張emp表。所以我們可以采用自連接。自連接的本意就是將一張表看成多張表來做連接。我們可以這樣來寫SQL語句:

SQL>?select?work.ename?worker,mgr.ename??manager?from?scott.emp?work,?scott.emp?mgr

??2??where?work.mgr?=?mgr.empno

??3??order?by?work.ename;

WORKER?????MANAGER

----------?----------

ADAMS??????SCOTT

ALLEN??????BLAKE

BLAKE??????KING

CLARK??????KING

FORD???????JONES

JAMES??????BLAKE

JONES??????KING

MARTIN?????BLAKE

MILLER?????CLARK

SCOTT??????JONES

SMITH??????FORD

WORKER?????MANAGER

----------?----------

TURNER?????BLAKE

WARD???????BLAKE

已選擇13行。

?

?

各種連接的一個圖示:


Blog:?http://blog.csdn.NET/tianlesoftware?

網上資源:?http://tianlesoftware.download.csdn.Net?

相關視頻:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx?


from:?http://blog.csdn.net/tianlesoftware/article/details/5795896

Blog:?http://blog.csdn.NET/tianlesoftware?

網上資源:?http://tianlesoftware.download.csdn.Net?

相關視頻:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx?

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Oracle 表连接方式(内连接/外连接/自连接) 详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。