程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle數據庫學習筆記之表的聯合查詢

Oracle數據庫學習筆記之表的聯合查詢

編輯:Oracle數據庫基礎

Oracle數據庫表的聯合查詢的相關知識是本文我們主要要介紹的內容,包括交叉聯合、等值聯合和不等值聯合、內部聯合與外部聯合以及UNION和UNION ALL等內容,接下來我們就一一介紹這部分內容,希望能夠對您有所幫助。

1、交叉聯合:

使你對於“聯合”的概念開始產生最直觀的印象,因為交叉聯合的結果就是兩個表的笛卡爾積。

code example:select * from T1, T2;

假如表1有2條記錄,表2有3條記錄,那麼查詢結果就是2*3=6條記錄。

2、等值聯合與不等值聯合:

等值聯合:只顯示表1中的數據,以及表2中的、存在於表1中的數據。顧名思義,查詢條件/表達式中以等號(“=”)連接。

code example:

  1. select T1.sectionA, T1.sectionB, T2.sectionC from T1, T2  
  2. where T1.sectionA = T2.sectionA (and ...); 

不等值聯合:與等值聯合查詢類似,只不過在where子句中使用除等號以外的比較符連接,此處不以例詳述。

3、內部聯合與外部聯合

內部聯合:產生的結果行數取決於參加聯合的行數,也就是說內部聯合的行數取決於 WHERE 子句的結果。

code example:

  1. SELECT P.PARTNUM, P.DESCRIPTION, P.PRICE, O.NAME, O.PARTNUM  
  2. FROM PART P  JOINORDERS OON ORDERS.PARTNUM = 54

在這裡你使用的語法中的 JOIN ON 不是 ANSI 標准中所指定的,而是我們所使用的解釋器的附加語法,你可以用它來指明是內部聯合還是外部聯合,大多數解釋器對些都進行了類似的擴充,注意這種類型的聯合沒有 WHERE 子句。

內部聯合的定義不便介紹,個人理解上面的等值/不等值聯合查詢例子均為其代表,平時用到的查詢也多為內部查詢。

在學習過外觀查詢後有此感受,內部查詢結果的直觀與簡潔與外部查詢的“畫蛇添足”形成鮮明對比,那麼即使我們用到的不是外部聯合,那就一定是內部聯合了。

此外,對於概念和用法也不必做過多糾纏。這是因為——大多數的SQL 產品會判斷應該在你的查詢中使用哪一種聯合,事實上,如果你在過程中使用它(或在程序內使用它<包括存儲過程等>),你無需指明聯合類型,解釋器會為你選擇合適的語法形式。

如果你顯示地指明了聯合類型,那麼解釋器會用你指明的類型來代替(由解釋器自身實現)優化的類型。

外部聯合:產生的結果行數取決於參加聯合的行數,也就是說內部聯合的行數取決於 WHERE 子句的結果,而外部聯合則是表間的聯合。

code example:

  1. SELECT P.PARTNUM, P.DESCRIPTION, P.PRICE, O.NAME, O.PARTNUM   
  2. FROM PART P RIGHT OUTER JOINORDERS OON ORDERS.PARTNUM = 54

上述代碼示例中使用了 RIGHT OUTER JOIN,它會令 SQL 返回右邊表集內的全部記錄,對於ORDERS.PARTNUM<>54的也會顯示這些記錄,只不地在相應位置補以空值<NULL>。

左聯合也是一樣,只不過,由於表1與表2中的記錄條數不同,其查詢結果也大相徑庭。

注意到:在一些解釋器中使用+號來代替外部聯合。+號的意思就是——顯示我的全部內容,包括不匹配的內容。 

code example:

  1. select e.name, e.employee_id, ep.salary, ep.marital_status,  
  2. from employee_tbl e, employee_pay_tbl ep  
  3. where e.employee_id = ep.employee_id(+) and e.name like '%MITH' 

這條語句將會聯合兩個表,標有+號的 employee_id 將會全部顯示,包括不滿足條件的記錄。

4、表的自我聯合:

由於聯合查詢也常被譯為“連接”,因此在有些資料中看到的“自連接”查詢指的也是這個概念。它並無特別之處,是指表1與表2均為同一表名。其用處在於檢查表中數據的一致性。

比如T1表中兩條記錄的sectionA字段是同值的,這可能是由於數據錄入錯誤造成的,如果按正常數據使用它,可能造成不可預料的災難。

code example:

  1. SELECT F.PARTNUM, F.DESCRIPTION, S.PARTNUM, S.DESCRIPTION  
  2. FROM PART F, PART S  
  3. WHERE F.PARTNUM = S.PARTNUM  
  4. AND F.DESCRIPTION <> S.DESCRIPTION 

如果不存在上述異常數據,那麼查詢結果應該為空;否則1條異常記錄對應兩條查詢結果。可以此來檢查數據的一致性。

5、聯想到 UNION 與 UNION ALL

UNION與UNION ALL都用來連接兩個查詢(即兩個select子句),但前者返回兩個查詢的結果並去除其重復的部分,後者一樣對查詢結果進行合並,但是對於重復記錄並不去除。

UNION可以集合運算中的並集運算聯系起來,與其對應的是INTERSECT,即交集運算,它返回的是兩個查詢中共有的部分。

6、補充說明:

上述聯合查詢僅僅列舉重點,在聯合查詢的分類問題上並未作任何具體而微的闡述,甚至由於聯合查詢的應用在實際工作中比較少見,對此類概念的理解可以不作深究,但是一知半解是危險的,你為無知付出的代價是昂貴的。本文寫作的意義也在於此。

關於Oracle數據庫學習筆記之表的聯合查詢的相關知識就介紹到這裡了,希望本次的介紹能夠對您有所收獲!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved