Oracle數據庫表的聯合查詢的相關知識是本文我們主要要介紹的內容,包括交叉聯合、等值聯合和不等值聯合、內部聯合與外部聯合以及UNION和UNION ALL等內容,接下來我們就一一介紹這部分內容,希望能夠對您有所幫助。
1、交叉聯合:
使你對於“聯合”的概念開始產生最直觀的印象,因為交叉聯合的結果就是兩個表的笛卡爾積。
code example:select * from T1, T2;
假如表1有2條記錄,表2有3條記錄,那麼查詢結果就是2*3=6條記錄。
2、等值聯合與不等值聯合:
等值聯合:只顯示表1中的數據,以及表2中的、存在於表1中的數據。顧名思義,查詢條件/表達式中以等號(“=”)連接。
code example:
- select T1.sectionA, T1.sectionB, T2.sectionC from T1, T2
- where T1.sectionA = T2.sectionA (and ...);
不等值聯合:與等值聯合查詢類似,只不過在where子句中使用除等號以外的比較符連接,此處不以例詳述。
3、內部聯合與外部聯合
內部聯合:產生的結果行數取決於參加聯合的行數,也就是說內部聯合的行數取決於 WHERE 子句的結果。
code example:
- SELECT P.PARTNUM, P.DESCRIPTION, P.PRICE, O.NAME, O.PARTNUM
- FROM PART P JOINORDERS OON ORDERS.PARTNUM = 54;
在這裡你使用的語法中的 JOIN ON 不是 ANSI 標准中所指定的,而是我們所使用的解釋器的附加語法,你可以用它來指明是內部聯合還是外部聯合,大多數解釋器對些都進行了類似的擴充,注意這種類型的聯合沒有 WHERE 子句。
內部聯合的定義不便介紹,個人理解上面的等值/不等值聯合查詢例子均為其代表,平時用到的查詢也多為內部查詢。
在學習過外觀查詢後有此感受,內部查詢結果的直觀與簡潔與外部查詢的“畫蛇添足”形成鮮明對比,那麼即使我們用到的不是外部聯合,那就一定是內部聯合了。
此外,對於概念和用法也不必做過多糾纏。這是因為——大多數的SQL 產品會判斷應該在你的查詢中使用哪一種聯合,事實上,如果你在過程中使用它(或在程序內使用它<包括存儲過程等>),你無需指明聯合類型,解釋器會為你選擇合適的語法形式。
如果你顯示地指明了聯合類型,那麼解釋器會用你指明的類型來代替(由解釋器自身實現)優化的類型。
外部聯合:產生的結果行數取決於參加聯合的行數,也就是說內部聯合的行數取決於 WHERE 子句的結果,而外部聯合則是表間的聯合。
code example:
- SELECT P.PARTNUM, P.DESCRIPTION, P.PRICE, O.NAME, O.PARTNUM
- FROM PART P RIGHT OUTER JOINORDERS OON ORDERS.PARTNUM = 54;
上述代碼示例中使用了 RIGHT OUTER JOIN,它會令 SQL 返回右邊表集內的全部記錄,對於ORDERS.PARTNUM<>54的也會顯示這些記錄,只不地在相應位置補以空值<NULL>。
左聯合也是一樣,只不過,由於表1與表2中的記錄條數不同,其查詢結果也大相徑庭。
注意到:在一些解釋器中使用+號來代替外部聯合。+號的意思就是——顯示我的全部內容,包括不匹配的內容。
code example:
- select e.name, e.employee_id, ep.salary, ep.marital_status,
- from employee_tbl e, employee_pay_tbl ep
- where e.employee_id = ep.employee_id(+) and e.name like '%MITH'
這條語句將會聯合兩個表,標有+號的 employee_id 將會全部顯示,包括不滿足條件的記錄。
4、表的自我聯合:
由於聯合查詢也常被譯為“連接”,因此在有些資料中看到的“自連接”查詢指的也是這個概念。它並無特別之處,是指表1與表2均為同一表名。其用處在於檢查表中數據的一致性。
比如T1表中兩條記錄的sectionA字段是同值的,這可能是由於數據錄入錯誤造成的,如果按正常數據使用它,可能造成不可預料的災難。
code example:
- SELECT F.PARTNUM, F.DESCRIPTION, S.PARTNUM, S.DESCRIPTION
- FROM PART F, PART S
- WHERE F.PARTNUM = S.PARTNUM
- AND F.DESCRIPTION <> S.DESCRIPTION
如果不存在上述異常數據,那麼查詢結果應該為空;否則1條異常記錄對應兩條查詢結果。可以此來檢查數據的一致性。
5、聯想到 UNION 與 UNION ALL
UNION與UNION ALL都用來連接兩個查詢(即兩個select子句),但前者返回兩個查詢的結果並去除其重復的部分,後者一樣對查詢結果進行合並,但是對於重復記錄並不去除。
UNION可以集合運算中的並集運算聯系起來,與其對應的是INTERSECT,即交集運算,它返回的是兩個查詢中共有的部分。
6、補充說明:
上述聯合查詢僅僅列舉重點,在聯合查詢的分類問題上並未作任何具體而微的闡述,甚至由於聯合查詢的應用在實際工作中比較少見,對此類概念的理解可以不作深究,但是一知半解是危險的,你為無知付出的代價是昂貴的。本文寫作的意義也在於此。
關於Oracle數據庫學習筆記之表的聯合查詢的相關知識就介紹到這裡了,希望本次的介紹能夠對您有所收獲!