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

SQL 連接查詢核心語法:左連、右連、內連、全連詳解

     編輯:MySQL 綜合教學

連接類型對比表

連接類型關鍵字結果集特徵適用場景
內連接INNER JOIN / JOIN僅返回兩表匹配的行核心業務關聯查詢
左連接LEFT JOIN / LEFT OUTER JOIN左表全量 + 右表匹配 (無則 NULL)主表帶從屬信息查詢
右連接RIGHT JOIN / RIGHT OUTER JOIN右表全量 + 左表匹配 (無則 NULL)少用,可改 LEFT JOIN 表順序
全連接FULL JOIN / FULL OUTER JOIN兩表全量 + 匹配行合併 (MySQL 不直接支援)數據對賬、差異分析

標準語法範例


-- 內連接:查詢有訂單的用戶
SELECT u.id, u.name, o.order_no, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- 左連接:所有用戶及其訂單 (無訂單顯示 NULL)
SELECT u.id, u.name, o.order_no, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

-- 右連接:所有訂單及其用戶 (孤兒訂單用戶顯示 NULL)
SELECT u.id, u.name, o.order_no, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

-- 全連接模擬 (MySQL 不支援 FULL JOIN)
SELECT u.id, u.name, o.order_no, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
UNION
SELECT u.id, u.name, o.order_no, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

多表連接最佳實踐

  1. 驅動表選擇: 小表驅動大表,左連接左表為驅動表
  2. 索引覆蓋: ON 條件列、WHERE 過濾列建立組合索引
  3. 避免 SELECT *: 顯式列出所需列,減少網絡傳輸與臨時表開銷
  4. 條件下推: WHERE 條件盡量寫在 ON 後 (內連接無差異,外連接有語義差異)

外連接 WHERE 條件陷阱


-- 錯誤:WHERE 過濾右表列會將 LEFT JOIN 退化為 INNER JOIN
SELECT * FROM users u LEFT JOIN orders o ON u.id=o.user_id WHERE o.status='paid';

-- 正確:右表過濾條件放入 ON
SELECT * FROM users u LEFT JOIN orders o ON u.id=o.user_id AND o.status='paid';

性能優化提示

  • 使用 EXPLAIN 檢查 type=ref/eq_ref、Extra=Using index
  • 大表連接考慮 Hash Join (MySQL 8.0.18+) 或應用層分批查詢
  • 關聯子查詢改寫為 JOIN,避免 DEPENDENT SUBQUERY 低效執行計劃
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved