首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL LEFT/RIGHT/INNER JOIN 圖解實戰:關系表三表關聯查詢

     編輯:MySQL 綜合教學

MySQL LEFT/RIGHT/INNER JOIN 圖解實戰:關系表三表關聯查詢

以 user_id(主表)、user_profile(屬性表)、含重複/缺失數據的真實場景,通過可視化結果集對比,徹底講透三種連接的語義邊界與行數變化規律。

測試數據構建

CREATE TABLE user_id (id DECIMAL(18));
CREATE TABLE user_profile (id DECIMAL(18), name VARCHAR(255));

INSERT INTO user_id VALUES (1),(2),(3),(4),(5),(6),(1);  -- 1 重複,7 行
INSERT INTO user_profile VALUES (1,'aa'),(2,'bb'),(3,'cc'),(4,'dd'),(5,'ee'),(5,'EE'),(8,'zz');  -- 5 重複,8 不在 user_id,7 行

一、LEFT JOIN:以左表為主,保留左表所有行

SELECT a.id, IFNULL(b.name, 'N/A') AS name
FROM user_id a
LEFT JOIN user_profile b ON a.id = b.id;

LEFT JOIN 結果

idname
1aa
2bb
3cc
4dd
5ee
5EE
6N/A
1aa

規律:

  1. 左表每行在右表唯一匹配 → 1 行結果(1,2,3,4)。
  2. 左表行在右表多行匹配 → 展開 N 行(5→ee,EE;1→aa,aa)。
  3. 左表行在右表無匹配 → 右側列全 NULL(6→N/A)。
  4. 右表獨有行(8)完全丟棄。

二、RIGHT JOIN:以右表為主,保留右表所有行

邏輯鏡像 LEFT JOIN,右表 8 行全部保留,左表獨有行(6)丟棄,右表 8 無匹配 → 左側 NULL。

三、INNER JOIN:僅保留雙方都匹配的行

SELECT * FROM user_id a INNER JOIN user_profile b ON a.id = b.id;
-- 等價舊寫法
SELECT * FROM user_id a, user_profile b WHERE a.id = b.id;
-- 等價簡寫
SELECT * FROM user_id a JOIN user_profile b ON a.id = b.id;

INNER JOIN 結果

ididname
11aa
11aa
22bb
33cc
44dd
55ee
55EE

規律:

  • 結果集 = LEFT JOIN 結果 - 右側 NULL 行 = RIGHT JOIN 結果 - 左側 NULL 行。
  • 無 NULL 行,純交集(含重複展開)。
  • MySQL 不支持 FULL OUTER JOIN,需 LEFT JOIN UNION RIGHT JOIN 模擬。

四、實戰場景:查詢「在 user_id 中存在但 user_profile 中不存在」的記錄

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

結果:1 行(id=6)。

五、選型決策表

業務需求推薦連接理由
主表全保留,屬性表可選(如訂單+用戶信息)LEFT JOIN訂單不應因用戶信息缺失而消失
雙方必須同時存在(如用戶+角色權限)INNER JOIN無效關系直接過濾,語義精確
屬性表全保留,主表可選(如字典表+業務引用)RIGHT JOIN字典項不應因無業務引用而隱藏
需顯示雙方所有(含孤兒)LEFT UNION RIGHT模擬 FULL OUTER JOIN

JOIN 不是語法糖,是集合論在工程落地。搞清「誰為主、誰可缺、重複怎麼展開」,SQL 寫得準、跑得快、改得動。

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