Oracle串連查詢有3種:交叉串連、內串連、外串連。
交叉串連結果是其他串連結果的超集,外串連結果是內串連結果的超集。
接下的例子以departments_v、employees_v兩個視圖資料為例(4條部門資料,9條人員資料)
1.交叉串連:又稱笛卡爾積串連,是兩個或多個表間的無條件串連,因此它會將表1的每一條資料與表2的每一條資料連線,因此結果會有4*9=36條資料
2.內串連:根據指定的串連條件進行串連查詢,因此滿足串連條件的資料才會出現在結果集。
兩個表進行內串連查詢時,先找到表1的第一條記錄,然後從頭到尾掃描表2,將符合串連條件的記錄與表1第一條記錄串連成結果;
當表2掃描一遍後,再從表1的第二條記錄開始,從頭到尾掃描表2,將符合串連條件的與表1第二條記錄串連成結果...
:
直至表1中所有記錄處理完畢為止。
Oracle中,內串連的兩種寫法如下圖
3.外串連:在內串連的基礎上,將某個串連表不符合串連條件的記錄加入結果集。
Oracle中,左外串連、右外串連均有兩種串連方式。
⑴先看標準SQL語句串連方式
【左外串連】在內串連基礎上,將串連操作符左側表不符合串連條件的記錄加入結果集中,右側表則用null填充。(個人覺得這更適合解釋標準SQL語句的串連方式)
下圖為【dept表 left join emp表】此時可以把dept表為基準,串連條件為兩表部門號相同且部門號為10;
左側表dept 10號部門的記錄 與右側表emp 10號部門的員工記錄 滿足串連條件,因此加入結果集;
左側表dept 20號部門的記錄 與右側表emp 20號部門的員工記錄 不滿足串連條件,但該查詢為左串連,因此會把左側表dept20號部門的記錄加入結果集,右側表則null填充;
...
下圖為【emp表 left join dept表】 可按著上面的情況分析
【右外串連】在內串連基礎上,將串連操作符右側表不符合串連條件的記錄加入結果集中,左側表則用null填充。(個人覺得這更適合解釋標準SQL語句的串連方式)
【下圖為dept表right join emp表】此時可以把emp表為基準,串連條件為兩表部門號相同且部門號為10;
右側表emp 10號部門的員工記錄 與左側表dept 10號部門的記錄 滿足串連條件,因此加入結果集;
右側表emp 20號部門的員工記錄 與左側表dept 20號部門的記錄 不滿足串連條件,但該查詢為右串連,因此會把右側表emp 20號部門的員工記錄加入結果集,左側表則null填充;
...
【下圖為emp表right join dept表】可按著上面的情況分析
⑵Oracle擴充的串連方式
【下圖為dept(+)emp】(右外串連)
【右外串連】在內串連基礎上,將串連操作符右側表不符合串連條件的記錄加入結果集中,左側表則用null填充。
因此可以解析為:串連條件等號哪邊的表用null填充,哪邊表的列均用(+),另一邊的表則會將不符合串連條件的記錄加入結果集,如下圖的emp表
交換表的順序為employees_v emp, departments_v dept(此時稱為左外串連),但結果一樣,只不過結果的列順序也交換過來,為EMPLOYEE_ID、FIRST_NAME、DEPARTMENT_ID、 DEPARTMENT_ID、DEPARTMENT_NAME
【下圖為dept emp(+)】(左外串連)
【左外串連】在內串連基礎上,將串連操作符左側表不符合串連條件的記錄加入結果集中,右側表則用null填充。
因此可以解析為:串連條件等號哪邊的表用null填充,哪邊表的列均用(+),另一邊的表則會將不符合串連條件的記錄加入結果集,如下圖的dept表
交換表的順序為employees_v emp, departments_v dept(此時稱為右外串連),但結果一樣,只不過結果的列順序也交換過來,為EMPLOYEE_ID、FIRST_NAME、DEPARTMENT_ID、 DEPARTMENT_ID、DEPARTMENT_NAME
!!!若dept表的列需全加(+),卻如下圖那樣,則不會起作用,僅僅如內串連查詢般。
4.全外串連:在內串連的基礎上,將串連操作符兩側表不符合串連條件的記錄加入結果集。
全外串連只有標準SQL語句的串連方式表示。
分析:將滿足條件的記錄選出,再將一側emp表中不滿足串連條件的記錄加入結果集,最後將另一側dept表中不滿足串連條件的記錄加入結果集。
下圖為去掉一個條件,分析可按照上圖情況推理。
比同樣串連條件的【內串連】多了最後一條記錄:
總結:(個人理解方式)
標準SQL語句串連方式:
【A left join B】left join即把左邊表A當作基準。在內串連操作方式下,遇到符合串連條件的記錄加入結果集,遇到A中不合格記錄也加入(因為它是標準),但對應B表的記錄用null填充;
【A right join B】right join即把右邊表B當作基準。在內串連操作方式下,遇到符合串連條件的記錄加入結果集,遇到B中不合格記錄也加入(因為它是標準),但對應A表的記錄用null填充;
oracle擴充串連方式:串連條件哪邊表的列用(+),則它的記錄用null值填充(也可把null當作預留位置一樣,沒有東西空佔著位置),另一邊的表就是會把不符合串連條件的記錄也加進查詢結果中。