一般的相等連接:
select * from a, b where a.id = b.id;
這個就屬于內連接。
對于外連接:
Oracle中可以使用“(+) ”來表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN
LEFT OUTER JOIN:左外關聯
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id);
等價于
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id=d.department_id(+)
結果為:所有員工及對應部門的記錄,包括沒有對應部門編號department_id的員工記錄。
RIGHT OUTER JOIN:右外關聯
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);
等價于
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+)=d.department_id
結果為:所有員工及對應部門的記錄,包括沒有任何員工的部門記錄。
FULL OUTER JOIN:全外關聯
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON (e.department_id = d.department_id);
結果為:所有員工及對應部門的記錄,包括沒有對應部門編號department_id的員工記錄和沒有任何員工的部門記錄。
ORACLE8i是不直接支持完全外連接的語法,也就是說不能在左右兩個表上同時加上(+),下面是在ORACLE8i可以參考的完全外連接語法
select t1.id,t2.id from table1 t1,table t2 where t1.id=t2.id(+)
union
select t1.id,t2.id from table1 t1,table t2 where t1.id(+)=t2.id
連接類型 | 定義 | 圖示 | 例子 |
內連接 | 只連接匹配的行 | ![]() |
select A.c1,B.c2 from A join B on A.c3 = B.c3; |
左外連接 | 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行)以及右邊表中全部匹配的行 | ![]() |
select A.c1,B.c2 from A left join B on A.c3 = B.c3; |
右外連接 | 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行)以及左邊表中全部匹配的行 | ![]() |
select A.c1,B.c2 from A right join B on A.c3 = B.c3; |
全外連接 | 包含左、右兩個表的全部行,不管在另一邊的表中是否存在與它們匹配的行 | ![]() |
select A.c1,B.c2 from A full join B on A.c3 = B.c3; |
(theta)連接 | 使用等值以外的條件來匹配左、右兩個表中的行 | ![]() |
select A.c1,B.c2 from A join B on A.c3 != B.c3; |
交叉連接 | 生成笛卡爾積——它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行一一匹配 | select A.c1,B.c2 from A,B; |