一般所說的左串連,外串連是指左外串連,右外串連。做個簡單的測試你看吧。
先說左外串連和右外串連:
| 代碼如下 |
複製代碼 |
[TEST1@orcl#16-12月-11] SQL>select * from t1; ID NAME ---------- -------------------- 1 aaa 2 bbb [TEST1@orcl#16-12月-11] SQL>select * from t2; ID AGE ---------- ---------- 1 20 3 30 左外串連: [TEST1@orcl#16-12月-11] SQL>select * from t1 left join t2 on t1.id=t2.id; ID NAME ID AGE ---------- -------------------- ---------- ---------- 1 aaa 1 20 2 bbb 右外串連: [TEST1@orcl#16-12月-11] SQL>select * from t1 right join t2 on t1.id=t2.id; ID NAME ID AGE ---------- -------------------- ---------- ---------- 1 aaa 1 20 3 30 |
從上面的顯示你可以看出:左外串連是以左邊的表為基準。通俗的講,先將左邊的表全部顯示出來,然後右邊的表id與左邊表id相同的記錄就“拼接”上去,比如說id為1的記錄。如果沒有匹配的id,比如說t1中id為2的t2中就沒有。那邊就以null顯示。
右外串連過程正好相反。
再看內串連(也稱為等值串連):
| 代碼如下 |
複製代碼 |
[TEST1@orcl#16-12月-11] SQL>select * from t1 inner join t2 on t1.id=t2.id; ID NAME ID AGE ---------- -------------------- ---------- ---------- 1 aaa 1 20 |
看到沒有? 只有一條記錄。內串連就是只取出符合過濾條件的記錄 也就是t1.id=t2.id 那麼符合t1.id=t2.id的記錄只有id=1這一條,所以只顯示一條。 不像外串連,是將你作為基準的表(左外串連就是左邊表為基準,右外串連就是右邊表為基準)的所有行都顯示出來。
上條sql語句等價於:
| 代碼如下 |
複製代碼 |
select * from t1,t2 where t1.id = t2.id |
補充說明:
1、內聯結(典型的聯結運算,使用像 = 或 <> 之類的比較子)。包括相等聯結和自然聯結。
內聯結使用比較子根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。
2、外聯結。外聯結可以是左向外聯結、右向外聯結或完整外部聯結。
在 FROM子句中指定外聯結時,可以由下列幾組關鍵字中的一組指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外聯結的結果集包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯結列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有挑選清單列均為空白值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外聯結是左向外聯結的反向聯結。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部聯結返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的挑選清單列包含空值。如果表之間有匹配行,則整個結果集行包含基表的資料值。
3、交叉聯結
交叉聯結返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯結也稱作笛卡爾積。
FROM 子句中的表或視圖可通過內聯結或完整外部聯結按任意順序指定;但是,用左或右向外聯結指定表或視圖時,表或視圖的順序很重要。有關使用左或右向外聯結排列表的更多資訊,請參見使用外聯結。