一、內連線
內連線查詢操作列出與連線條件匹配的資料行,它使用比較運算子比較被連線列的列值。內連線分三種:
1、等值連線:在連線條件中使用等於號(=)運算子比較被連線列的列值,其查詢結果中列出被連線表中的所有列,包括其中的重複列。
2、不等連線: 在連線條件使用除等於運算子以外的其它比較運算子比較被連線的列的列值。這些運算子包、>=、<=、、!和<>。
3、自然連線:在連線條件中使用等於(=)運算子比較被連線列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連線表中的重複列。
二、外連線
返回到查詢結果集合中的不僅包含符合連線條件的行,而且還包括左表(左外連線時)、右表(右外連線時)或兩個邊接表(全外連線)中的所有資料行。
三、交叉連線
交叉連線不帶where 子句,它返回被連線的兩個表所有資料行的笛卡爾積,返回到結果集合中的資料行數等於第乙個表中符合查詢條件的資料行數乘以第二個表中符合查詢條件的資料行數。例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連線檢索到的記錄數將等於6*8=48行。
例項說明:
一、內連線
select *
from [book] as b,[student] as s
where b.studentid=s.studentid
等價於如下(也可以不要關鍵字inner,此為系統預設)
select *
from [book] as b inner join [student] as s
on b.studentid=s.studentid
結果為:
執行過程
相當於內連線的向右連線。以from [book] inner join [student]等式右邊為基準,即以student表(等式右表,s表)的s.studentid為基準,遍歷book表(等式左表,book表)中與之匹配的b.studentid,然後拼接返回。結果含有重複的列,b.studentid和s.studentid。
說明這與where b.studentid=s.studentid或者s.studentid=b.studentid位置沒有關係。它僅僅代表滿足條件而已,不判定誰為基準。以下外連線,交叉連線相同操作。
二、外連線
1、左外連線
**select *
from [book] as b left join [student] as s
on b.studentid=s.studentid
等價於select *
from [book] as b left join [student] as s
on b.studentid=s.studentid(+)
結果執行過程
即以from [book] left join [student]的book表為基準,即以book表(b表)的b.studentid為基準。遍歷student表(s表)中與之匹配的b.studentid。若b.studentid含有s.studentid匹配項,則進行拼接,然後遍歷student表的下一條s.studentid,當查詢完畢則進入下一條b.studentid。若b.studentid沒有相應s.studentid匹配項時,則顯示左表的項,拼接右表的項顯示為null。
2、右外連線
**select *
from [book] as b right join [student] as s
on b.studentid=s.studentid
等價於select *
from [book] as b right join [student] as s
on b.studentid(+)=s.studentid
結果執行過程
即以from [book] right join [student]的student表為基準,即以student表(s表)的s.studentid為基準。遍歷book表(b表)中與之匹配的s.studentid。若s.studentid含有b.studentid匹配項,則進行拼接,然後遍歷book表的下一條b.studentid,當查詢完畢則進入下一條s.studentid。若s.studentid沒有相應b.studentid匹配項時,則顯示右表的項,拼接左表的項顯示為null。
3、全外連線
**select *
from [book] as b full outer join [student] as s
on b.studentid=s.studentid
結果執行過程
即以from [book] full outer join [student]中先以book表進行左外連線,然後以student表進行右外連線。
三、交叉連線
**select *
from [book] as b cross join [student] as a
order by b.bookid
結果執行過程
即是按照order排序的id,把要join的右表無條件拼接過來。這樣依次執行,這樣這種記錄便為兩個表的記錄的笛卡爾積。
oracle資料庫系統會使用一種機制,來決定哪一種組合效能最好。這種機制稱為基於成本的優化器(cost-based optimization,簡稱為cbo),
在檢視sql執行計畫時,我們會發現表的連線方式有多種,對錶的連線方式進行介紹以便更好看懂執行計畫和理解sql執行原理。
表的連線:在電信、金融等領域的資料庫相關應用中所佔比例
nested loops join(巢狀迴圈連線)70%:返回少量記錄
hash join(雜湊連線)20%:基於吞吐量的,返回大量的資料,但是雜湊演算法不算排序,由pga中的hash_area_size來控制。雖然比排序合併更高效一些,但是也有一些限制。
merge sort join(排序合併連線)10%:由pga中的sort_area_size來控制。
hint : /*+leading(t1) use_nl(t2)*/
use_nl:強制使用巢狀迴圈連線方式
leading(t1):強制先訪問t1表,t1表作為驅動表,t2表是被驅動表。
在巢狀迴圈連線方式中,驅動表返回多少條記錄,被驅動表就訪問多少次。要特別注意驅動表的順序,小的結果集先訪問,大的結果集後訪問,才能保證被驅動表的訪問次數降到最低,從而提公升效能。支援所有sql連線條件寫法,沒有任何限制。
hint : /*+leading(t1) use_hash(t2)*/
在雜湊連線中:驅動表和被驅動表都只會訪問0次或者1次。要特別注意驅動表的順序,小的結果集先訪問,大的結果集後訪問,才能保證被驅動表的訪問次數降到最低,從而提公升效能。雜湊連線不支援不等值連線(<>)、不支援和》的連線方式、也不支援like的連線方式。
hint : /*+leading(t1) use_merge(t2)*/
在合併排序中:根本沒有驅動和被驅動的概念,t1表和t2表都只會訪問0次或者1次。無論哪張表在前都無妨。排序合併連線不支援不等值連線(<>)、也不支援like的連線方式。但是支援和》的連線方式。
總結:巢狀迴圈連線和雜湊連線有驅動順序,驅動表的順序不同將影響表連線的效能,而排序合併沒有驅動概念,無論哪張表在前都無妨。
除了巢狀迴圈連線不需要排序之外,排序合併和雜湊連線都消耗記憶體,排序合併需要排序,但是雜湊連線不需要排序,消耗記憶體是用於建立hash表。排序只取部分字段,消耗的記憶體就越少。
適用於nl連線的場景:
(1)兩表關聯返回的記錄不多,最佳情況是驅動表的結果集返回1條或少量的及條記錄,而被驅動表僅匹配到1條或少量的幾條記錄,這種情況即便t1表和t2表的記錄很大,但是也非常迅速。
(2)遇到不等值查詢等導致雜湊和排序合併連線被限制使用,不得不使用nl連線。
(3)驅動表的限制條件所在列有索引,被驅動表的連線條件所在列有索引。
hash連線和merge sort連線:連線條件的索引對它們起不到傳遞作用,索引的連線條件起不到快速檢索的作用,但是限制條件如果有合適的索引可以快速檢索到少量記錄,還是可以提公升效能的。
雜湊連線:兩表關聯等值查詢,在沒有任何索引的情況下,oracle傾向於走雜湊演算法,增大pga中的hash_area_size是優化雜湊連線的有效方法。對於記憶體自動管理的,只要增大pga就行。
排序合併連線:索引的連線條件雖然沒有檢索作用,卻有消除排序的作用。缺陷:即使在連線條件的兩個列都建過索引,卻只能消除一張表的排序。增大記憶體排序區,避免在排序尺寸過大時在磁碟中排序。
Linux查詢檔案及其內容
whereis 程式名稱 查詢軟體的安裝路徑 b 只查詢二進位制檔案 m 只查詢幫助檔案 s 只查詢源 u 排除指定型別檔案 f 只顯示檔名 b 目錄 在指定目錄下查詢二進位制檔案 m 目錄 在指定目錄下查詢幫助檔案 s 目錄 在指定目錄下查詢源 locate 檔名稱 在檔案索引資料庫中搜尋檔案 d...
Oracle表的連線查詢總結
關鍵字 inner join join 所謂內部鏈結也可以稱為簡單連線,它連線兩個或多個表,只返回符合連線條件的行。下面通過 進行簡單示例 表tablel1 columna columnb columnc x1y1 z1x2 y2z2 x3y3y3 表tablel2 columna columnd ...
Oracle學習 之 表的連線查詢
這個內容在資料庫系統中已經學習過了,這只簡單介紹oracle中join的方式和注意點 簡介 自然連線將兩個資料來源中具有相同名稱的列進行連線。select from 表1 natural join 表2 簡介 又稱為簡單連線,它把兩個或多個表進行連線,只查出匹配的記錄,不匹配的記錄將無法查詢出來。即...