SQL JOIN 型別
1. INNER JOIN
- 定義:返回兩個表中滿足連線條件的交集部分,即僅返回兩表中的匹配記錄。
- 適用場景:
- 只關心兩個表中都有的匹配記錄。
- 資料關係明確,需要過濾掉沒有對應關係的記錄。
- 示例:
SELECT employees.name, departments.department_name FROM employees INNER JOIN departments ON employees.department_id = departments.id;
2. LEFT JOIN (或 LEFT OUTER JOIN)
- 定義:返回左表的所有記錄及右表中與之匹配的記錄,如果右表中沒有匹配的記錄,則返回 NULL。
- 適用場景:
- 需要返回左表中的所有記錄,即使右表中沒有匹配項。
- 主表記錄必須顯示,但關聯表可能沒有對應記錄。
- 示例:
SELECT employees.name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.id;
3. RIGHT JOIN (或 RIGHT OUTER JOIN)
- 定義:返回右表的所有記錄及左表中與之匹配的記錄,如果左表中沒有匹配的記錄,則返回 NULL。
- 適用場景:
- 需要返回右表中的所有記錄,即使左表中沒有匹配項。
- 右表記錄必須顯示,但左表可能沒有對應記錄。
- 示例:
SELECT employees.name, departments.department_name FROM employees RIGHT JOIN departments ON employees.department_id = departments.id;
4. FULL JOIN (或 FULL OUTER JOIN)
- 定義:返回兩個表中的所有記錄,無論是否滿足連線條件,未匹配的部分用 NULL 填充。
- 適用場景:
- 需要返回兩個表的所有記錄,無論是否匹配。
- 用於合併兩個表的資料集,不丟失任何一方的資料。
- 示例:
SELECT employees.name, departments.department_name FROM employees FULL JOIN departments ON employees.department_id = departments.id;
5. CROSS JOIN
- 定義:返回兩個表的笛卡爾積,即每個左表記錄與右表的每個記錄組合。
- 適用場景:
- 生成所有可能的組合。
- 用於計算所有可能的配對,如測試或報告生成。
- 示例:
SELECT products.name, categories.category_name FROM products CROSS JOIN categories;
6. SELF JOIN
- 定義:表與其自身進行 JOIN 操作。
- 適用場景:
- 將表中的記錄與同一表中的其他記錄進行比較。
- 處理層級關係或自關聯資料。
- 示例:
SELECT e1.name AS Employee, e2.name AS Manager FROM employees e1 INNER JOIN employees e2 ON e1.manager_id = e2.id;
7. NATURAL JOIN
- 定義:自動根據兩個表中同名列進行匹配,無需指定連線條件。
- 適用場景:
- 當兩個表之間的連線條件是基於同名列時。
- 簡化查詢語句,但容易引發不確定性。
- 示例:
SELECT * FROM employees NATURAL JOIN departments;
總結
- INNER JOIN:適用於獲取兩個表的交集,資料關係明確的場景。
- LEFT JOIN:適用於需要保留左表資料的情況,即使右表中沒有匹配。
- RIGHT JOIN:適用於需要保留右表資料的情況,即使左表中沒有匹配。
- FULL JOIN:適用於需要保留兩表所有記錄的情況,無論匹配與否。
- CROSS JOIN:適用於生成兩個表的所有組合的場景。
- SELF JOIN:用於表內資料的自關聯情況,如層級關係。
- NATURAL JOIN:適用於同名列自動匹配的簡單情況,但需注意引發的不確定性。
根據實際業務需求和資料關係,選擇合適的 JOIN 型別,以確保查詢的效率和結果的正確性。