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

MySQL LEFT JOIN 左連接實戰:查詢關聯表中不存在的資料

     編輯:MySQL 資料庫相關知識

前言

LEFT JOIN 是查詢「主表有、從表無」資料的利器。本文以使用者表與使用者資料表為例,展示基本與複雜條件下的左連接寫法。

一、基本場景:找出 user_profile 中不存在的 user

資料表:user (主表) 、user_profile (從表),以 id 關聯。

SELECT COUNT(*)
FROM user
LEFT JOIN user_profile ON user.id = user_profile.id
WHERE user_profile.id IS NULL;

原理: 左連接保留左表所有列,右表無匹配則為 NULL;WHERE ... IS NULL 即過濾出「只有左表有」的記錄。

二、複雜條件:多欄位 OR/AND 組合

SELECT COUNT(*)
FROM user
LEFT JOIN user_profile ON user.id = user_profile.id
WHERE user.level > 1 
   OR user_profile.money > 10000;

此查詢回傳:等級大於 1 的使用者,或 資料表中金額超過 10000 的使用者(含無資料者,因 NULL > 10000 為 UNKNOWN,需注意三值邏輯)。

三、進階技巧:IS NULL vs NOT EXISTS

寫法語意效能備註
LEFT JOIN ... WHERE t2.id IS NULL左表有、右表無早期版本優化較好
NOT EXISTS (SELECT 1 FROM t2 WHERE t2.id = t1.id)不存在滿足條件的右表記錄現代優化器處理相同,語意更清晰
NOT IN (SELECT id FROM t2)左表ID不在右表ID集合中若子查詢含NULL會回傳空集合,慎用

四、實務建議

  • 關聯欄位**必須建立索引**,否則大表左連接極慢。
  • 僅需檢查存在性時,SELECT 1 或 SELECT COUNT(*) 比 SELECT * 快。
  • 複雜條件建議先用 EXPLAIN 分析執行計畫,確認用到索引。

小結

LEFT JOIN ... WHERE IS NULL 是查找「孤兒記錄」的標準模式;搭配索引與 NOT EXISTS 可應對大多數差集查詢需求。理解三值邏輯 (TRUE/FALSE/NULL) 對複雜條件正確性至關重要。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved