Oracle數(shù)據(jù)庫學(xué)習(xí)筆記之表的聯(lián)合查詢
Oracle數(shù)據(jù)庫表的聯(lián)合查詢的相關(guān)知識是本文我們主要要介紹的內(nèi)容,包括交叉聯(lián)合、等值聯(lián)合和不等值聯(lián)合、內(nèi)部聯(lián)合與外部聯(lián)合以及UNION和UNION ALL等內(nèi)容,接下來我們就一一介紹這部分內(nèi)容,希望能夠?qū)δ兴鶐椭?/p>
1、交叉聯(lián)合:
使你對于“聯(lián)合”的概念開始產(chǎn)生最直觀的印象,因為交叉聯(lián)合的結(jié)果就是兩個表的笛卡爾積。
code example:select * from T1, T2;
假如表1有2條記錄,表2有3條記錄,那么查詢結(jié)果就是2*3=6條記錄。
2、等值聯(lián)合與不等值聯(lián)合:
等值聯(lián)合:只顯示表1中的數(shù)據(jù),以及表2中的、存在于表1中的數(shù)據(jù)。顧名思義,查詢條件/表達(dá)式中以等號(“=”)連接。
code example:
- select T1.sectionA, T1.sectionB, T2.sectionC from T1, T2
- where T1.sectionA = T2.sectionA (and ...);
不等值聯(lián)合:與等值聯(lián)合查詢類似,只不過在where子句中使用除等號以外的比較符連接,此處不以例詳述。
3、內(nèi)部聯(lián)合與外部聯(lián)合
內(nèi)部聯(lián)合:產(chǎn)生的結(jié)果行數(shù)取決于參加聯(lián)合的行數(shù),也就是說內(nèi)部聯(lián)合的行數(shù)取決于 WHERE 子句的結(jié)果。
code example:
- SELECT P.PARTNUM, P.DESCRIPTION, P.PRICE, O.NAME, O.PARTNUM
- FROM PART P JOINORDERS OON ORDERS.PARTNUM = 54;
在這里你使用的語法中的 JOIN ON 不是 ANSI 標(biāo)準(zhǔn)中所指定的,而是我們所使用的解釋器的附加語法,你可以用它來指明是內(nèi)部聯(lián)合還是外部聯(lián)合,大多數(shù)解釋器對些都進(jìn)行了類似的擴(kuò)充,注意這種類型的聯(lián)合沒有 WHERE 子句。
內(nèi)部聯(lián)合的定義不便介紹,個人理解上面的等值/不等值聯(lián)合查詢例子均為其代表,平時用到的查詢也多為內(nèi)部查詢。
在學(xué)習(xí)過外觀查詢后有此感受,內(nèi)部查詢結(jié)果的直觀與簡潔與外部查詢的“畫蛇添足”形成鮮明對比,那么即使我們用到的不是外部聯(lián)合,那就一定是內(nèi)部聯(lián)合了。
此外,對于概念和用法也不必做過多糾纏。這是因為——大多數(shù)的SQL 產(chǎn)品會判斷應(yīng)該在你的查詢中使用哪一種聯(lián)合,事實上,如果你在過程中使用它(或在程序內(nèi)使用它<包括存儲過程等>),你無需指明聯(lián)合類型,解釋器會為你選擇合適的語法形式。
如果你顯示地指明了聯(lián)合類型,那么解釋器會用你指明的類型來代替(由解釋器自身實現(xiàn))優(yōu)化的類型。
外部聯(lián)合:產(chǎn)生的結(jié)果行數(shù)取決于參加聯(lián)合的行數(shù),也就是說內(nèi)部聯(lián)合的行數(shù)取決于 WHERE 子句的結(jié)果,而外部聯(lián)合則是表間的聯(lián)合。
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 返回右邊表集內(nèi)的全部記錄,對于ORDERS.PARTNUM<>54的也會顯示這些記錄,只不地在相應(yīng)位置補(bǔ)以空值<NULL>。
左聯(lián)合也是一樣,只不過,由于表1與表2中的記錄條數(shù)不同,其查詢結(jié)果也大相徑庭。
注意到:在一些解釋器中使用+號來代替外部聯(lián)合。+號的意思就是——顯示我的全部內(nèi)容,包括不匹配的內(nèi)容。
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'
這條語句將會聯(lián)合兩個表,標(biāo)有+號的 employee_id 將會全部顯示,包括不滿足條件的記錄。
4、表的自我聯(lián)合:
由于聯(lián)合查詢也常被譯為“連接”,因此在有些資料中看到的“自連接”查詢指的也是這個概念。它并無特別之處,是指表1與表2均為同一表名。其用處在于檢查表中數(shù)據(jù)的一致性。
比如T1表中兩條記錄的sectionA字段是同值的,這可能是由于數(shù)據(jù)錄入錯誤造成的,如果按正常數(shù)據(jù)使用它,可能造成不可預(yù)料的災(zāi)難。
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
如果不存在上述異常數(shù)據(jù),那么查詢結(jié)果應(yīng)該為空;否則1條異常記錄對應(yīng)兩條查詢結(jié)果??梢源藖頇z查數(shù)據(jù)的一致性。
5、聯(lián)想到 UNION 與 UNION ALL
UNION與UNION ALL都用來連接兩個查詢(即兩個select子句),但前者返回兩個查詢的結(jié)果并去除其重復(fù)的部分,后者一樣對查詢結(jié)果進(jìn)行合并,但是對于重復(fù)記錄并不去除。
UNION可以集合運(yùn)算中的并集運(yùn)算聯(lián)系起來,與其對應(yīng)的是INTERSECT,即交集運(yùn)算,它返回的是兩個查詢中共有的部分。
6、補(bǔ)充說明:
上述聯(lián)合查詢僅僅列舉重點,在聯(lián)合查詢的分類問題上并未作任何具體而微的闡述,甚至由于聯(lián)合查詢的應(yīng)用在實際工作中比較少見,對此類概念的理解可以不作深究,但是一知半解是危險的,你為無知付出的代價是昂貴的。本文寫作的意義也在于此。
關(guān)于Oracle數(shù)據(jù)庫學(xué)習(xí)筆記之表的聯(lián)合查詢的相關(guān)知識就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】






