新聞中心
Oracle數(shù)據(jù)庫(kù)表的聯(lián)合查詢(xún)的相關(guān)知識(shí)是本文我們主要要介紹的內(nèi)容,包括交叉聯(lián)合、等值聯(lián)合和不等值聯(lián)合、內(nèi)部聯(lián)合與外部聯(lián)合以及UNION和UNION ALL等內(nèi)容,接下來(lái)我們就一一介紹這部分內(nèi)容,希望能夠?qū)δ兴鶐椭?/p>

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


咨詢(xún)
建站咨詢(xún)
