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

MySQL 左連接、右連接與內連接詳解及差異比較

     編輯:MySQL 資料庫相關知識

SQL 連接查詢是多表關聯的核心。本文以具體範例資料,圖解 LEFT JOIN、RIGHT JOIN、INNER JOIN 的語義差異、結果集特徵與適用場景。

範例資料準備

-- 表 table1
CREATE TABLE table1 (name VARCHAR(32), city VARCHAR(32)) ENGINE=MyISAM;
INSERT INTO table1 VALUES
('Person A','BJ'), ('Person B','BJ'), ('Person C','SH'), ('Person D','SZ');

-- 表 table2
CREATE TABLE table2 (name VARCHAR(32), city VARCHAR(32)) ENGINE=MyISAM;
INSERT INTO table2 VALUES
('Person W','BJ'), ('Person X','SH'), ('Person Y','SH'), ('Person Z','NJ');

關聯鍵: city(城市)

1. LEFT JOIN(左連接)

以左表為主,左表所有列均會出現。

  • 左表城市在右表**唯一匹配** → 產生 1 筆結果(Person A/B 對應 BJ)。
  • 左表城市在右表**多筆匹配** → 產生 N 筆結果(Person C 對應 SH,右表有 X/Y 兩筆 → 2 筆)。
  • 左表城市在右表**無匹配** → 右側欄位全為 NULL(Person D 對應 SZ,右表無 SZ)。

不符合上述規則的右表資料(如 Person Z/NJ)不會出現。

2. RIGHT JOIN(右連接)

以右表為主,右表所有列均會出現,邏輯與 LEFT JOIN 鏡像對稱。

  • 右表城市在左表唯一匹配 → 1 筆(Person X/Y 對應 SH)。
  • 右表城市在左表多筆匹配 → N 筆(Person W 對應 BJ,左表有 A/B 兩筆 → 2 筆)。
  • 右表城市在左表無匹配 → 左側欄位全 NULL(Person Z 對應 NJ)。

3. INNER JOIN(內連接)

**僅保留雙方都有匹配的列**,結果集中**無 NULL 欄位**。

可視為 LEFT/RIGHT JOIN 結果中**移除含 NULL 列**後的集合。若兩表僅保留內連接產出的資料,則 LEFT/RIGHT/INNER 結果一致。

語法等價:

SELECT * FROM table1 a INNER JOIN table2 b ON a.city = b.city;
SELECT * FROM table1 a JOIN table2 b ON a.city = b.city;  -- 省略 INNER 同義

注意: MySQL **不支援** FULL JOIN(全外連接),需用 LEFT JOIN UNION RIGHT JOIN 模擬。

結果集對照表

連接類型主導表結果筆數含 NULL 欄位典型用途
LEFT JOIN左表左表筆數 + 多匹配展開右側可能為 NULL主表完整保留,附帶關聯明細(如訂單+商品)
RIGHT JOIN右表右表筆數 + 多匹配展開左側可能為 NULL較少用,可改寫為 LEFT JOIN 交換表順序
INNER JOIN雙向匹配僅匹配成功的筆數無嚴格關聯查詢(如有效訂單統計)

效能建議

  • 關聯欄位(city)務必**建立索引**。
  • 優先使用 INNER JOIN,減少中間結果集大小。
  • LEFT JOIN 時,將**小表放左邊**(作驅動表),大表放右邊(被驅動表),利用索引快速查找。
  • 避免在 ON 條件中使用函數或運算,導致索引失效。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved