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

MySQL JOIN 多表關聯查詢完全指南:INNER、LEFT、RIGHT 實戰詳解

     編輯:MySQL 綜合教學

實際開發中絕大多數查詢涉及多表關聯。本文從基礎語法到實戰範例,系統講解 MySQL 中 INNER JOIN、LEFT JOIN、RIGHT JOIN 的差異、適用場景與 PHP 整合示例,助你寫出高效、可讀的關聯查詢。

基礎概念:JOIN 類型對比

JOIN 類型結果集包含典型場景
INNER JOIN兩表匹配的行只需雙方都存在的關聯數據(如:訂單+用戶)
LEFT JOIN左表所有行 + 右表匹配行(無匹配則 NULL)主表全量保留(如:所有用戶+其訂單,含無訂單用戶)
RIGHT JOIN右表所有行 + 左表匹配行較少用,可改寫為 LEFT JOIN 互換表順序

實戰範例環境

-- tutorials_tbl:教程表
tutorial_id | tutorial_title | tutorial_author | submission_date
1           | Learn PHP      | John Poul       | 2007-05-24
2           | Learn MySQL    | Abdul S         | 2007-05-24
3           | JAVA Tutorial  | Sanjay          | 2007-05-06

-- tcount_tbl:作者教程統計表
tutorial_author | tutorial_count
mahran          | 20
mahnaz          | NULL
Jen             | NULL
Gill            | 20
John Poul       | 1
Sanjay          | 1

INNER JOIN:僅返回匹配行

SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
FROM tutorials_tbl a
INNER JOIN tcount_tbl b ON a.tutorial_author = b.tutorial_author;

-- 結果:僅 John Poul (1) 和 Sanjay (1) 兩行
-- Abdul S、mahran 等無匹配行被過濾

LEFT JOIN:保留左表所有行

SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
FROM tutorials_tbl a
LEFT JOIN tcount_tbl b ON a.tutorial_author = b.tutorial_author;

-- 結果:3 行
-- 1 | John Poul | 1
-- 2 | Abdul S   | NULL  -- 右表無匹配,補 NULL
-- 3 | Sanjay    | 1

PHP 整合範例 (mysqli 風格)

<?php
$mysqli = new mysqli("localhost", "root", "password", "TUTORIALS");
if ($mysqli->connect_errno) {
    die("Connect failed: " . $mysqli->connect_error);
}

$sql = "SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
        FROM tutorials_tbl a
        LEFT JOIN tcount_tbl b ON a.tutorial_author = b.tutorial_author";

if ($result = $mysqli->query($sql)) {
    while ($row = $result->fetch_assoc()) {
        echo "Author: {$row['tutorial_author']} <br>";
        echo "Count: {$row['tutorial_count']} <br>";
        echo "Tutorial ID: {$row['tutorial_id']} <br>";
        echo "--------------------------------<br>";
    }
    $result->free();
}
$mysqli->close();
?>

多表 JOIN 最佳實踐

  1. 小表驅動大表:將結果集較小的表放在 LEFT JOIN 左側或 INNER JOIN 先驅動
  2. 關聯欄位建索引:ON 條件欄位雙方必須有索引
  3. 避免 SELECT *:顯式列出需要的欄位,減少網路傳輸與緩存污染
  4. 使用別名:a、b 簡化欄位引用,提升可讀性
  5. WHERE 條件下推:過濾條件盡量寫在 ON 子句而非 WHERE(特別是 LEFT JOIN)

常見錯誤

  • LEFT JOIN 後在 WHERE 中對右表欄位判斷 IS NOT NULL,導致退化為 INNER JOIN
  • 關聯欄位類型不一致(如 VARCHAR vs INT)導致隱式轉換、索引失效
  • 多表 JOIN 缺少關聯條件產生笛卡爾積

總結

掌握 JOIN 類型語義差異,配合索引設計與 EXPLAIN 分析,是寫出高效 SQL 的核心技能。實際項目中 90%+ 場景使用 INNER JOIN 與 LEFT JOIN 即可覆蓋。

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