多表關聯時Oracle遞歸兩兩連接產生結果集再關聯下一表。五大連接模式完整解析:
共同欄位值相等的行出現在結果中。
SELECT * FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
-- ANSI標準
SELECT * FROM EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;
除匹配行外,保留單邊不匹配行。
| 語法(Oracle舊式) | ANSI標準 | 保留方 |
|---|---|---|
WHERE EMP.DEPTNO(+) = DEPT.DEPTNO | RIGHT OUTER JOIN | DEPT(右表) |
WHERE EMP.DEPTNO = DEPT.DEPTNO(+) | LEFT OUTER JOIN | EMP(左表) |
FULL OUTER JOIN(9i+)保留雙邊 | ||
比較運算子> < BETWEEN ... AND等。典型案例:薪資等級表SALGRADE(LOSAL/HISAL)。
SELECT EMPNO, ENAME, SAL, GRADE
FROM EMP, SALGRADE
WHERE EMP.SAL BETWEEN LOSAL AND HISAL;
表自我關聯,取別名視為兩表。案例:員工與主管關係。
SELECT W.ENAME, W.MGR, M.EMPNO, M.ENAME
FROM EMP W, EMP M
WHERE W.MGR = M.EMPNO;
UNIFORM SIZE 1M提升I/OHASH_JOIN_ENABLED=TRUE + PGA_AGGREGATE_TARGET足夠大HASH_AREA_SIZE為9i前相容參數ORDERED Hint時,FROM第一張表建Hash TableSELECT /*+ USE_HASH(a b) */ a.user_name, b.dev_no
FROM user_info a, dev_info b
WHERE a.user_id = b.user_id;
缺乏有用索引時優於Nested Loop;記憶體Hash比對快於B-Tree索引檢索。
掌握五大連接模式與Hash Join調優參數,是SQL調優從入門到精通的必經之路。