實際開發中,單表查詢遠遠不夠。訂單需要關聯用戶、商品需要關聯分類、文章需要關聯作者——JOIN 多表連接 是關聯式資料庫的核心技能。MySQL 支援三大標準連接類型,各有其適用場景。
| 連接類型 | 別名 | 核心語義 | 適用場景 |
|---|---|---|---|
| INNER JOIN | 內連接 / 等值連接 | 僅返回兩表條件匹配的行 | 需要雙方都存在的關聯資料(如:訂單+用戶) |
| LEFT JOIN | 左連接 | 返回左表所有行,右表無匹配則填 NULL | 主表為主,附屬資料可選(如:用戶+最後登入記錄) |
| RIGHT JOIN | 右連接 | 返回右表所有行,左表無匹配則填 NULL | 較少用,可用 LEFT JOIN 交換表順序替代 |
兩張核心表:
runoob_tbl:教程主表(id、標題、作者、發布日期)tcount_tbl:作者統計表(作者、文章數),含 NULL 值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 預設即為內連接。
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。
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 可降低認知負擔。

<?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>";
}
?>
runoob_author)務必建立索引。type=ref 或 eq_ref 表示索引生效。熟練掌握三大 JOIN,配合索引優化,即可高效解決 90% 以上的多表查詢需求。