查詢「所有人員及其訂單」,若用內連接或舊式 WHERE 連接,無訂單人員會被過濾掉。
| Persons | Orders | ||||||
|---|---|---|---|---|---|---|---|
| Id_P | LastName | FirstName | City | Id_O | OrderNo | Id_P | |
| 1 | Adams | John | London | 1 | 77895 | 3 | |
| 2 | Bush | George | New York | 2 | 44678 | 3 | |
| 3 | Carter | Thomas | Beijing | 3 | 22456 | 1 | |
| 4 | 24562 | 1 | |||||
| 5 | 34764 | 65 | |||||
SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p, Orders o
WHERE p.Id_P = o.Id_P;
結果:Adams、Carter 各兩筆;Bush 完全消失(無匹配訂單)。
SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p INNER JOIN Orders o ON p.Id_P = o.Id_P;
SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p LEFT JOIN Orders o ON p.Id_P = o.Id_P
ORDER BY p.LastName;
| LastName | FirstName | OrderNo |
|---|---|---|
| Adams | John | 77895 |
| Adams | John | 44678 |
| Bush | George | NULL |
| Carter | Thomas | 22456 |
| Carter | Thomas | 24562 |
Bush 保留,OrderNo 顯示 NULL — 完美解決主表資料遺失問題。
SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p RIGHT JOIN Orders o ON p.Id_P = o.Id_P;
| LastName | FirstName | OrderNo |
|---|---|---|
| Adams | John | 77895 |
| Adams | John | 44678 |
| Carter | Thomas | 22456 |
| Carter | Thomas | 24562 |
| NULL | NULL | 34764 |
訂單 34764 對應 Person Id_P=65 不存在,人員欄位顯示 NULL。
SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p FULL JOIN Orders o ON p.Id_P = o.Id_P;
| LastName | FirstName | OrderNo |
|---|---|---|
| Adams | John | 77895 |
| Adams | John | 44678 |
| Bush | George | NULL |
| Carter | Thomas | 22456 |
| Carter | Thomas | 24562 |
| NULL | NULL | 34764 |
LEFT JOIN(最常用)RIGHT JOINFULL JOININNER JOIN/*+ LEADING(small_table) USE_HASH(large_table) */