oracle數(shù)據(jù)庫(kù)超全的多表查詢連接
一、簡(jiǎn)述
1、兩個(gè)表的連接,是通過(guò)將一個(gè)表中的一列或者多列同另一個(gè)表中的列連接而建立起來(lái)的。用來(lái)連接兩張表的表達(dá)式組成了連接條件。當(dāng)連接成功后,第二張表中的數(shù)據(jù)就同第一張表連接起來(lái)了,并形成了復(fù)合結(jié)果集。
2)、有5種基本類(lèi)型的的連接,inner,outer,natural,cross連接,自連接。
SQL的標(biāo)準(zhǔn)語(yǔ)法:
select table1.column,table2.column from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2; ----說(shuō)明 inner join 表示內(nèi)連接; left join表示左外連接; right join表示右外連接; full join表示完全外連接; on子句用于指定連接條件。
注意:
若使用from子句指定內(nèi)、外連接,則需要使用on子句指定連接條件;
若使用(+)操作符指定外連接,則必須使用where子句指定連接條件。
二、說(shuō)明與例子
2.1、內(nèi)連接 inner join
特點(diǎn):只有滿足條件的數(shù)據(jù)。和用select查詢多表(使用where)是一樣的效果,所以內(nèi)連接用地很少。(inner join可簡(jiǎn)寫(xiě)為join)
內(nèi)連接查詢操作列出與連接條件匹配的數(shù)據(jù)行,它使用比較運(yùn)算符比較被連接列的列值。
1、等值連接:在連接條件中使用等于號(hào)(=)運(yùn)算符比較被連接列的列值,其查詢結(jié)果中列出被連接表中的所有列,包括其中的重復(fù)屬性。(區(qū)別于自然連接)
2、不等連接:在連接條件使用除等于運(yùn)算符以外的其它比較運(yùn)算符比較被連接的列的列值。這些運(yùn)算符包括>、>=、<=、<、!>、!< 和 <>。
teacher 和 student 表
select * from student s inner join teacher t on s.teacheid=t.teacheid; select * from student s join teacher t on s.teacheid=t.teacheid; --使用多表查詢 select * from student s,teacher t where s.teacheid=t.teacheid;
結(jié)果:(注意結(jié)果中包含重復(fù)屬性)

2.2、外連接 outer join
特點(diǎn):含有不滿足條件的數(shù)據(jù)。
外連接,返回到查詢結(jié)果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接或左連接))、右表(右外連接或右連接)或兩個(gè)邊接表(全外連接)中的所有數(shù)據(jù)行。
1.left join(左連接)等價(jià)于(left outer join(左外連接)) 返回包括左表中的所有記錄和右表中連接字段相等的記錄;(左表中所有記錄+右表中滿足條件的記錄)
2.right join(右連接)等價(jià)于(right outer join(右外連接))返回包括右表中的所有記錄和左表中連接字段相等的記錄;(右表中所有記錄+左表中滿足條件的記錄)
3. full join (全連接)等價(jià)于(full outer join(全外連接))查詢結(jié)果等于左外連接和右外連接的和。
例子:
(1)、左連接(左外連接) left join
select * from student s left join teacher t on s.teacheid=t.teacheid; 或 select * from student s ,teacher t where s.teacheid=t.teacheid(+);
查詢結(jié)果:包含student中的所有記錄和滿足條件的記錄

(2)、右連接(右外連接) right join
包含teacher中的所有記錄和滿足條件的記錄。
select * from student sright join teacher t on s.teacheid=t.teacheid; 或 select * from student s ,teacher t where s.teacheid(+)=t.teacheid;
查詢結(jié)果:

(3)、全連接(全外連接) full join
select * from student s full join teacher t on s.teacheid=t.teacheid;
輸出:(兩張表中的所有值)

對(duì)于外連接, 也可以使用“(+) ”來(lái)表示。 關(guān)于使用(+)的一些注意事項(xiàng):
1.(+)操作符只能出現(xiàn)在where子句中,并且不能與outer join語(yǔ)法同時(shí)使用。
2. 當(dāng)使用(+)操作符執(zhí)行外連接時(shí),如果在where子句中包含有多個(gè)條件,則必須在所有條件中都包含(+)操作符
3.(+)操作符只適用于列,而不能用在表達(dá)式上。
4.(+)操作符不能與or和in操作符一起使用。
5.(+)操作符只能用于實(shí)現(xiàn)左外連接(左連接)和右外連接(右連接),而不能用于實(shí)現(xiàn)完全外連接(全連接)。
6、用(+)號(hào)可以這樣來(lái)理解: + 表示補(bǔ)充,即哪個(gè)表有加號(hào),這個(gè)表就是匹配表。所以加號(hào)寫(xiě)在右表,左表就是全部顯示,故是左連接。
2.3、自然連接 natural join
特點(diǎn):所有數(shù)據(jù)類(lèi)型和列名都相同的字段作為條件組成的結(jié)果集,不含on。自然連接不包含重復(fù)的屬性
自然連接是在廣義笛卡爾積R×S中選出同名屬性上符合相等條件元組,再進(jìn)行投影,去掉重復(fù)的同名屬性,組成新的關(guān)系。即自然連接是在兩張表中尋找那些數(shù)據(jù)類(lèi)型和列名都相同(所有)的字段,然后自動(dòng)地將他們連接起來(lái),并返回所有符合條件的結(jié)果。
select * from student natural join teacher;
分析:兩個(gè)表中有兩個(gè)相同屬性,teacherid和deptno,不用加限定條件即按照這兩個(gè)字段連接
結(jié)果:(注意deptno屬性只有一個(gè))

有關(guān)自然連接的一些注意事項(xiàng):
(1).如果做自然連接的兩個(gè)表的有多個(gè)字段都滿足有相同名稱(chēng)和類(lèi)型,那么他們會(huì)被作為自然連接的條件。
(2).如果自然連接的兩個(gè)表字段名稱(chēng)相同,但數(shù)據(jù)類(lèi)型不同,那么將會(huì)返回一個(gè)錯(cuò)誤。
2.4、交叉連接(cross join)
特點(diǎn):不含on,返回兩個(gè)表所有數(shù)據(jù)行的笛卡爾積。
交叉連接不帶on子句,它返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積,返回到結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。 (5*5)
select * from student cross join teacher; 等價(jià)于:select * from student,teacher;
2.5、自連接(自己連接)
連接的表是同一張表,使用自連接可以將自身表的一個(gè)鏡像當(dāng)作另一個(gè)表來(lái)對(duì)待,從而能夠得到一些特殊的數(shù)據(jù)。
用途舉例:計(jì)算公交鏈路換乘問(wèn)題(見(jiàn)eg2)
select s1.*, s2.* from student s1 , student s2 where s1.depino=s2.depino and s1.classno=s2.classno;
2.6 多表查詢
select * from student s,teacher t where s.teacheid=t.teacheid;
特點(diǎn):多張表在一起,使用where作為查詢條件關(guān)鍵字。
2.7 子查詢
select * from student s where s.teacheid in(select teacheidfrom teacher);
總結(jié)
到此這篇關(guān)于oracle數(shù)據(jù)庫(kù)超全的多表查詢連接的文章就介紹到這了,更多相關(guān)oracle多表查詢連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle使用MyBatis中RowBounds實(shí)現(xiàn)分頁(yè)查詢功能
這篇文章主要介紹了Oracle使用MyBatis中RowBounds實(shí)現(xiàn)分頁(yè)查詢 ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Oracle密碼過(guò)期如何取消密碼180天限制及密碼180天過(guò)期,賬號(hào)鎖住的問(wèn)題
這篇文章主要介紹了Oracle密碼過(guò)期如何取消密碼180天限制及密碼180天過(guò)期,賬號(hào)鎖住的問(wèn)題,需要的朋友可以參考下2018-12-12
64位win7下pl/sql無(wú)法連接oracle解決方法
這篇文章主要介紹了64位win7下pl/sql無(wú)法連接oracle解決方法,需要的朋友可以參考下2014-03-03
使用Navicat Premium連接Oracle的方法步驟
這篇文章主要介紹了使用Navicat Premium連接Oracle的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Oracle中查看引起Session阻塞的2個(gè)腳本分享
這篇文章主要介紹了Oracle中查看引起Session阻塞的2個(gè)腳本分享,本文給出了2個(gè)腳本來(lái)查詢導(dǎo)致Session阻塞的原因,并給出Kill引起阻塞的Session方法,需要的朋友可以參考下2014-10-10
PLSQL創(chuàng)建新用戶并導(dǎo)入導(dǎo)出.dmp文件全過(guò)程
plsql導(dǎo)入.sql和.dmp文件時(shí)會(huì)經(jīng)常用到,對(duì)于初學(xué)者來(lái)說(shuō)可能沒(méi)有那么簡(jiǎn)單,畢竟oracle數(shù)據(jù)庫(kù)比較麻煩,這篇文章主要給大家介紹了關(guān)于PLSQL創(chuàng)建新用戶并導(dǎo)入導(dǎo)出.dmp文件的相關(guān)資料,需要的朋友可以參考下2023-11-11
Oracle數(shù)據(jù)庫(kù)TNS常見(jiàn)錯(cuò)誤的解決方法匯總
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)TNS常見(jiàn)錯(cuò)誤的解決方法,需要的朋友可以參考下2014-07-07

