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

MySQL 連接查詢圖解:LEFT/RIGHT/INNER JOIN 行級匹配邏輯全解析

     編輯:MySQL 資料庫相關知識

通過兩張 4 行的城市表(table1/table2),以 city 為關聯鍵,逐行演示三種 JOIN 的輸出機制,助你徹底搞懂「誰為主、誰補 NULL、誰被過濾」。

測試數據

table1: (Person A,BJ) (Person B,BJ) (Person C,SH) (Person D,SZ)
table2: (Person W,BJ) (Person X,SH) (Person Y,SH) (Person Z,NJ)

1. LEFT JOIN(以左表為主)

SELECT * FROM table1 LEFT JOIN table2 ON table1.city = table2.city;
  • A/B → BJ 在右表唯一匹配 W → 各產生 1 行。
  • C → SH 在右表匹配 X/Y → 產生 2 行(笛卡爾積)。
  • D → SZ 右表無匹配 → 右側列全 NULL,保留 1 行。

結果 4+2+1=7 行,左表無行丟失。

2. RIGHT JOIN(以右表為主)

  • X/Y → SH 左表匹配 C → 2 行。
  • W → BJ 左表匹配 A/B → 2 行。
  • Z → NJ 左表無匹配 → 左側全 NULL,保留 1 行。

結果 7 行,右表無行丟失。

3. INNER JOIN(僅保留雙邊均有匹配)

  • 等價於 LEFT JOIN 結果中剔除「任意側全 NULL」的行。
  • 本例保留 A/B/C/W/X/Y 相關 6 行;D、Z 被過濾。

關鍵結論

  1. JOIN 無前綴 = INNER JOIN。
  2. MySQL 不支持 FULL JOIN;需 LEFT UNION RIGHT 模擬。
  3. ON 條件中列類型、字符集、Collation 不一致會導致隱式轉換、索引失效、甚至錯誤匹配。
  4. 大表驅動小表:用小表做驅動表(LEFT JOIN 左表 / RIGHT JOIN 右表),並確保被驅動表關聯列有索引。

調試技巧

EXPLAIN SELECT ...  -- 觀察 type=ref/eq_ref、rows、Extra=Using where

若 rows 接近全表掃描,檢查索引、字符集、條件下推。

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