永不放棄,一切皆有可能!!!
只為成功找方法,不為失敗找借口!
oracle連接總結(內連接、外連接、自然連接,交叉連接,自連接)
1.簡述
2.說明與例子
1)內連接 (inner join (可簡寫為join))
內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。
1、等值連接:在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重復屬性。 (區別於自然連接)
2、不等連接: 在連接條件使用除等於運算符以外的其它比較運算符比較被連接的 列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。


SELECT S.*, T.* FROM STUDENT S INNER JOIN TEACHER T ON S.TEACHERID = T.ID; //注意oracle重命名table 不能加as只需加空格即可,as可用於重命名列
結果:(注意結果中包含重復屬性,重復的屬性結果中重命名了)
eg2:
SELECT * FROM STUDENT JOIN TEACHER ON STUDENT.DEPTNO= TEACHER.DEPTNO;
2)自然連接(natural join)
自然連接是在廣義笛卡爾積R×S中選出同名屬性上符合相等條件元組,再進行投影,去掉重復的同名屬性,組成新的關系。即自然連接是在兩張表中尋找那些數據類型和列名都相同的字段,然后自動地將他們連接起來,並返回所有符合條件按的結果。
SELECT STUDNET.CLASSID,TEACHER.DEPTNO FROM STUDENT NATURAL JOIN TEACHER;
報錯:(不能加限定條件)
SQL 錯誤: ORA-25155: NATURAL 聯接中使用的列不能有限定詞 25155. 00000 - "column used in NATURAL join cannot have qualifier" *Cause: Columns that are used for a named-join (either a NATURAL join or a join with a USING clause) cannot have an explicit qualifier. *Action: Remove the qualifier.
eg2:
SELECT * FROM STUDENT NATURAL JOIN TEACHER;
分析:兩個表中有兩個相同屬性,TEACHERID和DEPTNO,不用加限定條件即按照這兩個字段連接
結果:(注意deptno屬性只有一個)
下面對比使用inner join的結果:(包含重復屬性,並且連接方式區別於自然連接)
SELECT * FROM STUDENT JOIN TEACHER ON STUDENT.DEPTNO= TEACHER.DEPTNO;
外連接,返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接或左連接))、右表(右外連接或右連接)或兩個邊接表(全外連接)中的所有數據行。
1.left join(左聯接)等價於(left outer join) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄;
2.right join(右聯接)等價於(right outer join)返回包括右表中的所有記錄和左表中聯結字段相等的記錄;
3. full join (全連接)等價於(full outer join)查詢結果等於左外連接和右外連接的和
eg1:
SELECT S.*, T.* FROM STUDENT S LEFT JOIN TEACHER T ON S.CLASSNO = T.CLASS;
輸出結果:(包含student中的所有記錄和滿足條件的記錄)
eg2:
SELECT S.*, T.* FROM STUDENT S RIGHT JOIN TEACHER T ON S.CLASSNO = T.CLASS;
結果:
SELECT S.*, T.* FROM STUDENT S FULL JOIN TEACHER T ON S.CLASSNO = T.CLASS;

交叉連接不帶ON子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到 結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查 詢條件的數據行數。
SELECT S.*, T.* FROM STUDENT S CROSS JOIN TEACHER T ;
等價於:
SELECT S.*, T.* FROM STUDENT S , TEACHER T ;
輸出結果:
5)自連接
連接的表是同一張表,使用自連接可以將自身表的一個鏡像當作另一個表來對待,從而能夠得到一些特殊的數據。
用途舉例:計算公交鏈路換乘問題(見eg2)
eg1:
SELECT S1.*, S2.* FROM STUDENT S1 , STUDENT S2 WHERE S1.DEPTNO=S2.DEPTNO AND S1.CLASSNO=S2.CLASSNO;
結果:
eg2:
table route(num, company, pos, stop)
SELECT * FROM route R1, route R2 WHERE R1.stop=R2.stop;
可查詢公用同一公交車站的所有路線
3.總結
1)即使是在連接條件不滿足的情況下,外部連接也會在結果集內返回行,而內部連接不會在結果集類返回行 當外部連接不滿足連接條件時,通常返回一個表中的列,但是第二個表中沒有返回值--為null
2)自然連接不包含重復的屬性
3)交叉連接是兩個表數據笛卡爾積(相當於不加連接條件)