Oracle的連接

Oracle的連接詳解(左連接、右連接、全連接...)

 

1  說明:

提到數據庫必須要知道聯接操作,這部分的內容在數據庫查詢操作中佔到舉足輕重的地位,今天我就來說說這些聯結操作。

聯接操作可以在WHERE中指定,也可以在FROM子句中指定,在FROM子句中指定聯接條件時,SQL2將聯接操作符分爲聯接類型和聯接條件兩部分。

聯接類型決定了如何處理聯接條件中不匹配的元組。

2  連接操作:

聯接條件決定了兩個關係中那些元素該匹配。

聯接類型

說明

INNER JOIN

內聯接,結果爲兩個聯接表中的匹配行的聯接

LEFT OUTER JOIN

左聯接:結果包括左表(出現在JOIN子句最左邊)中的所有行,不包括右表中的不匹配行。

RIGHT OUTER JOIN

右聯接:結果包括右表(出現在JOIN子句最右邊)中的所有行,不包括有左表中的不匹配的行。

FULL OUTER JOIN

完全聯接:結果包括所有聯接中的所有行,不論他們是否匹配。

CROSS JOIN

交叉聯接:結果包括兩個聯接表中的所有可能的行組合。交叉連接返回的是兩個表的笛卡兒積。(Oracle不支持)

NATURAL JOIN

自然連接時在兩張表中尋找那些數據類型 和列名都相等的字段,然後自動地將他們連接起來。

通俗的說:在左連接和右連接時都會以一張表作爲基表,該表的內容會全部的顯示,然後加上兩張表匹配的內容。

        

此圖引用至:http://blog.csdn.net/caolaosanahnu/article/details/8080350

 

對於外連接,在Oracle中可以使用(+)來表示,使用的方式:

1、(+)操作符只可以出現在WHERE子句中,並且不可以和outer join語法同時使用。

2、當使用(+)操作符執行外連接時,如果在where子句中包含多個條件,則必須在所有的條件中都包含(+)操作符。

3、(+)操作符只能適用於列,而不能用在表達式上。

4、(+)操作符不能與or和in操作符一起使用。

5、(+)操作符只能用於實現左外連接和右外連接,而不能用於實現完全外連接。

 

自然連接的注意事項:

(1)   如果做自然連接的兩個表中有多個字段都滿足有相同名稱和類型,那麼他們都會被作爲連接的條件。

(2)   如果自然兩個表中僅字段名稱相同,但是數據類型不同時,此時會返回一個錯誤。

 

這裏我再說明幾種連接方式,也當作一種補充知識了:

1、 Self joins自連接:

使用自連接,可以將自己表的一個鏡像作爲另一張表來對待,進行連接後查詢出數據。

2、 Cartesian Products 笛卡爾積

當兩個表沒有連接操作時,對這兩個表進行查詢得到的數據是什麼樣的呢?是這兩個表的笛卡兒積。

 

3 多表連接操作

在進行多表聯合查找時,會發現多表會進行連接操作的,而這些連接操作包括三種方式:

Hash Join(散列連接)、Nested Loops、Sort Merge join,對於這些連接方式的瞭解可以方便我們對於連接操作的進一步瞭解,下面進行一一介紹。

3.1  HASH JOIN(散列連接)

Hash Join散列連接主要是CBO(CBO: Cost-Based Optimization 基於代價的優化器, Oracle優化器之一,後續會進行介紹)做數據量比較大時進行連接操作比較常用的一種方式,優化器會選用兩個表中較小那個表(小一點表或者數據源),利用連接鍵(JOIN KEY)在內存中建立散列表,將列數據存儲到hash列表中,然後掃描大的那個表,同樣對JOIN KEY到hash表進行匹配,找出可以匹配的值,此時注意:如果HASH表比較大,無法一次存儲到內存時則會分成不多個partition(段),寫入磁盤的temporary segment,此時性能會多出一次寫的代價,有可能會降低效率。

該內容主要適用於較小的表(可以放入內存),此時相關效能就是訪問了兩個的性能的成本總和。

可以用USE_HASH(table_name1 table_name2)提示來強制使用散列連接。

3.2  SORT MERGE JOIN:排序合併連接

Merge Join排序合併連接,是先將兩個關聯的表按照關聯鍵(JOIN KEY)進行排序,然後從各自排序表中抽取數據,到另一個排序表中進行匹配。

相對來說,merge join需要完成排序操作,所以消耗的性能比較多,但是當源如果已經進行了排序,其將會取得較好的性能。適用於:不等價關聯(>,<,>=,<=,<>)、HASH_JOIN_ENABLED=false等情況。

可以使用USE_MERGE(table_name1 table_name2)來強制使用排序合併連接.

3.3  NESTED LOOP:嵌套循環連接

Nested Loops嵌套循環連接,工作方式是循環從一張表中讀取數據(驅動表 outer table),然後訪問另一張表(被查找表 inner table, 希望有索引)。驅動表中每一行與inner表中相應記錄進行鏈接(JOIN)。內表被外表驅動,外表中的每一行都會與內表進行匹配操作,所以查詢結果集最好不要太大。將數據量小的表作爲查詢的驅動表(外表),可以利用ordered 來提示CBO默認的驅動表。

對於驅動表較小的情況時,嵌套循環連接相對比較好,同時inner表需要有效的訪問索引(index)。

使用USE_NL(table_name1 table_name2)可是強制CBO 執行嵌套循環連接。

4  舉例:

Oracle的兩張表:部門信息表:DEPTINFO,用戶表:USERINFO

    

 

4.1  INNER JOIN連接操作:

INNER JOIN連接作爲一種等值連接,其操作相當於where中的等至連接。

 

 

4.2  LEFT JOIN連接操作:

USERINFO 左連接DEPTINFO,結果將以USERINFO爲基表,其內容將全部顯示。

 

Oracle包含了3種連接方式:分別是:

4.3  RIGHT JOIN鏈接操作

USERINFO右連接DEPTINFO,結果將以DEPTINFO爲基表,將其內容全部顯示出來。

 

4.4  FULL OUTER JOIN連接操作:

USERINFO 全連接DEPTINFO,結果將USERINFO以及DEPTINFO的內容都顯示出來。

  

4.5  NATURAL JION自然連接

 

4.6  利用(+)來實現連接操作:

1、無(+)連接:

 

 

2、左(+)連接:(相當於Right Join)

 

 

3、右(+)連接:(相當於Left Join)

 

注意:不可以左右都加(+)。

4.7  Self Join 自連接以及Cartesian Products笛卡兒積

          

                   自連接                                                        笛卡兒積

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章