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

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

     編輯:MySQL 入門

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

實際開發中,單表查詢遠遠不夠。訂單需要關聯用戶、商品需要關聯分類、文章需要關聯作者——JOIN 多表連接 是關聯式資料庫的核心技能。MySQL 支援三大標準連接類型,各有其適用場景。

三大 JOIN 類型對比速覽

連接類型 別名 核心語義 適用場景
INNER JOIN內連接 / 等值連接僅返回兩表條件匹配的行需要雙方都存在的關聯資料(如:訂單+用戶)
LEFT JOIN左連接返回左表所有行,右表無匹配則填 NULL主表為主,附屬資料可選(如:用戶+最後登入記錄)
RIGHT JOIN右連接返回右表所有行,左表無匹配則填 NULL較少用,可用 LEFT JOIN 交換表順序替代

範例資料集:RUNOOB 資料庫

兩張核心表:

  • runoob_tbl:教程主表(id、標題、作者、發布日期)
  • tcount_tbl:作者統計表(作者、文章數),含 NULL 值

實戰 1:INNER JOIN — 只取雙方都有的資料

mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count
    -> FROM runoob_tbl a
    -> INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
| 1 | John Poul | 1 |
| 3 | Sanjay | 1 |
+-----------+---------------+--------------+

解析: Abdul S、mahran、mahnaz、Jen、Gill 因雙方作者不匹配被過濾掉。INNER 關鍵字可省略,JOIN 預設即為內連接。

實戰 2:LEFT JOIN — 保留左表所有資料

mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count
    -> FROM runoob_tbl a
    -> LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| runoob_id | runoob_author | runoob_count |
+-------------+-----------------+----------------+
| 1 | John Poul | 1 |
| 2 | Abdul S | NULL |
| 3 | Sanjay | 1 |
+-------------+-----------------+----------------+

關鍵差異: Abdul S 在右表無對應記錄,但因 LEFT JOIN 保留左表,結果仍顯示,runoob_count 自動填充為 NULL。

實戰 3:RIGHT JOIN — 保留右表所有資料

mysql> SELECT b.runoob_id, b.runoob_author, a.runoob_count
    -> FROM tcount_tbl a
    -> RIGHT JOIN runoob_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| runoob_id | runoob_author | runoob_count |
+-------------+-----------------+----------------+
| 1 | John Poul | 1 |
| 2 | Abdul S | NULL |
| 3 | Sanjay | 1 |
+-------------+-----------------+----------------+

結果與 LEFT JOIN 相同,僅是表順序互換。實務上統一使用 LEFT JOIN 可降低認知負擔。

視覺化理解 JOIN 差異

INNER JOIN 示意圖 LEFT JOIN 示意圖 RIGHT JOIN 示意圖

PHP 中執行 JOIN 查詢

<?php
$sql = 'SELECT a.runoob_id, a.runoob_author, b.runoob_count
        FROM runoob_tbl a
        INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author';
$retval = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($retval)) {
    echo "Author: {$row['runoob_author']} <br> Count: {$row['runoob_count']} <br>";
}
?>

效能與最佳實踐建議

  1. 小表驅動大表: 用較小結果集的表作為驅動表(LEFT JOIN 左表、INNER JOIN 任一邊)。
  2. ON 條件加索引: 連接欄位(如 runoob_author)務必建立索引。
  3. 避免 SELECT *: 明確列出所需欄位,減少網路傳輸與記憶體佔用。
  4. 善用 EXPLAIN: 執行計畫中 type=ref 或 eq_ref 表示索引生效。

熟練掌握三大 JOIN,配合索引優化,即可高效解決 90% 以上的多表查詢需求。

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