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種基本類型的的連接,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)寫為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)寫在右表,左表就是全部顯示,故是左連接。
2.3、自然連接 natural join
特點(diǎn):所有數(shù)據(jù)類型和列名都相同的字段作為條件組成的結(jié)果集,不含on。自然連接不包含重復(fù)的屬性
自然連接是在廣義笛卡爾積R×S中選出同名屬性上符合相等條件元組,再進(jìn)行投影,去掉重復(fù)的同名屬性,組成新的關(guān)系。即自然連接是在兩張表中尋找那些數(shù)據(jù)類型和列名都相同(所有)的字段,然后自動(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è)字段都滿足有相同名稱和類型,那么他們會(huì)被作為自然連接的條件。
(2).如果自然連接的兩個(gè)表字段名稱相同,但數(shù)據(jù)類型不同,那么將會(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數(shù)據(jù)匹配merge into的實(shí)例詳解
這篇文章主要介紹了oracle數(shù)據(jù)匹配merge into的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10Oralce中VARCHAR2()與NVARCHAR2()的區(qū)別介紹
這篇文章主要給大家詳細(xì)介紹了關(guān)于Oralce中VARCHAR2()與NVARCHAR2()的區(qū)別,文中先通過(guò)翻譯官方的介紹進(jìn)行區(qū)別總結(jié),然后由一個(gè)實(shí)戰(zhàn)示例代碼進(jìn)行演示,相信對(duì)大家的理解會(huì)很有幫助,有需要的朋友們下面來(lái)跟著小編一起看看吧。2016-12-12Oracle?SQL報(bào)錯(cuò):ORA-06550解決辦法
這篇文章主要給大家介紹了關(guān)于Oracle?SQL報(bào)錯(cuò):ORA-06550的解決辦法,Oracle的ORA-06550錯(cuò)誤是一個(gè)常見(jiàn)的Oracle數(shù)據(jù)庫(kù)錯(cuò)誤代碼,文中通過(guò)代碼及圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04優(yōu)化Oracle庫(kù)表設(shè)計(jì)的若干方法
優(yōu)化Oracle庫(kù)表設(shè)計(jì)的若干方法...2007-03-03oracle通過(guò)行范圍查詢?nèi)?至10行并排序
這篇文章主要介紹了oracle如果查詢?nèi)?至10行并排序,很簡(jiǎn)單,很實(shí)用,正在學(xué)習(xí)oracle的朋友可以參考下2014-09-09pl/sql導(dǎo)入、導(dǎo)出csv等格式文件詳細(xì)步驟
在 PL/SQL 開(kāi)發(fā)中數(shù)據(jù)的導(dǎo)入和導(dǎo)出是常見(jiàn)的操作,下面這篇文章主要給大家介紹了關(guān)于pl/sql導(dǎo)入、導(dǎo)出csv等格式文件的詳細(xì)步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04oracle取數(shù)據(jù)庫(kù)中最新的一條數(shù)據(jù)可能會(huì)遇到的bug(兩種情況)
這篇文章主要介紹了oracle取數(shù)據(jù)庫(kù)中最新的一條數(shù)據(jù)可能會(huì)遇到的bug,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Oracle生成單據(jù)編號(hào)存儲(chǔ)過(guò)程的實(shí)例代碼
Oracle生成單據(jù)編號(hào)存儲(chǔ)過(guò)程,在做訂單類似的系統(tǒng)都可能會(huì)存在訂單編號(hào)不重復(fù),或是流水號(hào)按日,按年,按月進(jìn)行重新編號(hào)。下面給大家分享oracle生成單據(jù)編號(hào)存儲(chǔ)過(guò)程,需要的的朋友參考下吧2017-04-04