首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL LEFT JOIN 與 INNER JOIN 混合使用技巧:以左表為基準保留 NULL 再篩選

     編輯:MySQL 資料庫相關知識

混合使用 LEFT JOIN 與 INNER JOIN 可實現「以某表為基準保留所有行,再對關聯表做嚴格匹配篩選」的靈活查詢。

行為差異回顧

  • LEFT JOIN:保留左表所有行,右表無匹配則為 NULL。
  • INNER JOIN:僅保留雙方均有匹配的行,任一方 NULL 則該行消失。

混合模式範例

-- 需求:列出所有客戶,若有訂單則顯示訂單金額,並只保留金額 > 1000 的訂單行
SELECT c.CustomerID, c.Name, o.OrderID, o.Amount
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
  AND o.Amount > 1000;  -- 條件放在 ON 子句,不影響左表保留

-- 對比:條件放在 WHERE 會變成 INNER JOIN 效果
SELECT c.CustomerID, c.Name, o.OrderID, o.Amount
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE o.Amount > 1000;  -- 無訂單或金額≤1000 的客戶行被過濾掉

進階模式:多表混合

SELECT c.Name, o.OrderID, od.ProductID, p.ProductName
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
INNER JOIN OrderDetails od ON o.OrderID = od.OrderID
LEFT JOIN Products p ON od.ProductID = p.ProductID;
  • 客戶無訂單 → o.*、od.*、p.* 全為 NULL (因 INNER JOIN 要求 o.OrderID 存在,左表無訂單時 o.OrderID 為 NULL,導致內連結失敗,整行只剩客戶欄位)。
  • 若需「客戶無訂單也保留,有訂單則必須有明細與產品」→ 調整順序或改用 LEFT JOIN 串聯。

最佳實踐建議

  1. 篩選條件放在 ON 子句 保留外部連結語意;放在 WHERE 會隱性轉為內部連結。
  2. 明確別名 避免欄位模糊。
  3. EXPLAIN 觀察連接順序,必要時用 STRAIGHT_JOIN 或括號控制優化器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved