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

MySQL多表連接查詢深度解析:內連接、左/右外連接、復合條件與性能優化實戰

     編輯:MySQL 資料庫相關知識

連接查詢本質

將兩張或多張表按關聯列(通常是外鍵)匹配,組合成寬表輸出。關鍵在於關聯條件與連接類型的選擇。

參考表

  • employee(num, name, d_id, sex, age, address)
  • department(d_id, d_name, function)

公共列:d_id(部門ID)

四大連接類型對比

類型語法結果集典型場景
內連接INNER JOIN / JOIN / WHERE雙方都匹配的行主流業務,如訂單-用戶
左外連接LEFT JOIN左表全量+右表匹配行(無則NULL)主表帶從表信息,如用戶-訂單(含無訂單用戶)
右外連接RIGHT JOIN右表全量+左表匹配行(無則NULL)少用,可改為LEFT JOIN交換表順序
全外連接FULL JOIN雙方全量(MySQL不支持,用UNION模擬)雙向全量保留

實戰示例

內連接(隱式/顯式)

-- 顯式語法(推薦,語義清晰)
SELECT e.num, e.name, e.d_id, e.sex, d.d_name, d.function
FROM employee e
INNER JOIN department d ON e.d_id = d.d_id;

-- 隱式語法(舊標準,不推薦)
SELECT ... FROM employee e, department d WHERE e.d_id = d.d_id;

結果:3行(僅有部門的員工)

左外連接

SELECT e.num, e.name, e.d_id, d.d_name, d.function
FROM employee e
LEFT JOIN department d ON e.d_id = d.d_id;

結果:4行(含Aric d_id=1004無對應部門,d_name/function=NULL)

右外連接

SELECT e.num, e.name, e.d_id, d.d_name, d.function
FROM employee e
RIGHT JOIN department d ON e.d_id = d.d_id;

結果:4行(含銷售部無員工,num/name/d_id=NULL)

復合條件連接

SELECT e.num, e.name, e.d_id, e.sex, e.age, e.address
FROM employee e
INNER JOIN department d ON e.d_id = d.d_id
WHERE e.age >= 25;  -- 額外業務過濾條件

結果:2行(張三26歲、王五25歲)

性能優化鐵律

  1. 小表驅動大表:LEFT JOIN左表應為小表;INNER JOIN優化器自動選擇驅動表
  2. 關聯列建索引:d_id雙方均需索引,否則ALL JOIN全表掃描災難
  3. 條件下推:WHERE條件盡量寫在ON子句(外連接語義不同)或WHERE(內連接等價)
  4. 避免SELECT *:僅查詢所需列,利用覆蓋索引
  5. 優先內連接:優化器對內連接重排序自由度最高,外連接限制較多

EXPLAIN關鍵列解讀

  • type=ref/eq_ref:索引查找,良好
  • type=ALL:全表掃描,需加索引
  • Extra=Using where; Using index:覆蓋索引,最優
  • Extra=Using temporary; Using filesort:臨時表+排序,優化GROUP BY/ORDER BY

連接查詢是關係型數據庫威力的核心體現,正確選型與索引配合,決定著系統查詢性能的上限。

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