這里我先附上兩張表的數據:
Orders 表:
OrderID | CustomerID |
---|---|
1 | 3 |
2 | 1 |
3 | 2 |
4 | NULL |
Customers 表:
CustomerID | CustomerName |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
4 | David |
INNER JOIN 🤝
概念: INNER JOIN(內連接)返回兩個表中匹配的記錄。如果某條記錄在其中一個表中沒有匹配項,那么它就不會出現在結果集中。
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
結果:
OrderID | CustomerName |
---|---|
1 | Charlie |
2 | Alice |
3 | Bob |
解釋: 只顯示了在兩個表中都存在的匹配記錄。訂單4因為CustomerID
為NULL,在Customers
表中沒有匹配,所以不顯示。
LEFT JOIN 👈
概念: LEFT JOIN(左連接)返回左表(LEFT JOIN關鍵字左邊的表)的所有記錄,即使在右表中沒有匹配。如果右表中沒有匹配,則結果為NULL。
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
結果:
OrderID | CustomerName |
---|---|
1 | Charlie |
2 | Alice |
3 | Bob |
4 | NULL |
?解釋: 顯示了Orders
表中的所有記錄,對于CustomerID
為NULL的訂單4,CustomerName
為NULL,因為沒有匹配的顧客信息。
RIGHT JOIN 示例 👉
概念: RIGHT JOIN(右連接)與LEFT JOIN相反,它返回右表(RIGHT JOIN關鍵字右邊的表)的所有記錄,即使左表中沒有匹配。如果左表中沒有匹配,則結果為NULL。
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
結果:
OrderID | CustomerName |
---|---|
1 | Charlie |
2 | Alice |
3 | Bob |
NULL | David |
?解釋: 顯示了Customers
表中的所有記錄,對于顧客David,因為沒有對應的訂單(OrderID
為NULL),依然會被列出
FULL JOIN 示例 ?? (以支持的數據庫為例)
由于不是所有數據庫都直接支持FULL JOIN,這里提供一個概念上的說明和一個可能的解決方案(比如在MySQL中使用UNION)。
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
FULL JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
概念上的結果:
OrderID | CustomerName |
---|---|
1 | Charlie |
2 | Alice |
3 | Bob |
4 | NULL |
NULL | David |
解釋: 顯示了Orders
和Customers
表中的所有記錄,兩邊沒有匹配的部分用NULL填充。
總結:
- INNER JOIN:匹配兩邊的記錄,無匹配則不顯示。
- LEFT JOIN:以左表為主,左表所有記錄均顯示,右表無匹配則NULL。
- RIGHT JOIN:以右表為主,右表所有記錄均顯示,左表無匹配則NULL。
- FULL JOIN:展示兩邊所有記錄,任一邊無匹配則對應側為NULL。