MySQL 中各種 JOIN 的差別

程式技術

MySQL 中的 JOIN 語法,可以讓我們將多張表關聯起來,但就跟斯斯有三種一樣,JOIN 也有三種,分別是。

  • INNER JOIN (可以簡寫成 JOIN)。
  • LEFT JOIN (有些資料庫會是 LEFT OUTER JOIN)。
  • RIGHT JOIN (有些資料庫會是 RIGHT OUTER JOIN)。

那麼這三種 JOIN 的差別在哪裡?

為了方便說明,我們先假設我們有兩張表 post_tag 與 tags。

post_tag 的資料與欄位如下。

idpost_idtag_id
1143
2216
3256

tags 的資料與欄位如下。

idname
1Ruby
2Swift
3TypeScript
4Laravel
5Ruby on Rails

我們先用一個查詢語法撈出所有 post_tag 的資料。

SELECT *
FROM post_tag

查詢的結果如下。

idpost_idtag_id
1143
2216
3256

我們使用 INNER JOIN 將 tags 的資料加進來。

SELECT *
FROM post_tag
JOIN tags
ON post_tag.tag_id = tags.id

查詢的結果如下。

idpost_idtag_ididname
114343Docker
221616Vue.js
325656Tailwind CSS

我們將 JOIN 改成 LEFT JOIN。

SELECT *
FROM post_tag
LEFT JOIN tags
ON post_tag.tag_id = tags.id

我們可以看到結果沒變。

idpost_idtag_ididname
114343Docker
221616Vue.js
325656Tailwind CSS

那如果改成 RIGHT JOIN 呢。

SELECT *
FROM post_tag
RIGHT JOIN tags
ON post_tag.tag_id = tags.id

可以發現 tags 的資料全部都被放了進來。

idpost_idtag_ididname
114343Docker
221616Vue.js
325656Tailwind CSS
(NULL)(NULL)(NULL)1Ruby
(NULL)(NULL)(NULL)2Swift
(NULL)(NULL)(NULL)3TypeScript
(NULL)(NULL)(NULL)4Laravel

做個實驗,我們將 FROM 的表單與 JOIN 的表單對調。

SELECT *
FROM tags
LEFT JOIN post_tag
ON post_tag.tag_id = tags.id

查詢的結果如下。

idnameidpost_idtag_id
43Docker1143
16Vue.js2216
56Tailwind CSS3256
1Ruby(NULL)(NULL)(NULL)
2Swift(NULL)(NULL)(NULL)
3TypeScript(NULL)(NULL)(NULL)
4Laravel(NULL)(NULL)(NULL)

總結

整理每個 JOIN 的差別。

  • INNER JOIN:要兩張表都符合 ON 條件才會撈出來。
  • LEFT JOIN:左邊指的是 LEFT JOIN 左側的表單,即 table_1 表單。LEFT JOIN 會把符合 ON 條件,以及 table_1 表單的資料全部撈出來。
SELECT * FROM table_1 LEFT JOIN table_2 ON ...
  • RIGHT JOIN:指的是 RIGHT JOIN 右側的表單,即 table_2 表單。RIGHT JOIN 會把符合 ON 條件,還會把 table_2 表單的資料全部撈出來。
SELECT * FROM table_1 RIGHT JOIN table_2 ON ...
Allen
written by
Allen

持續努力中的後端打工仔,在下班後喜歡研究各種不同的技術。稍微擅長 PHP,並偶爾涉獵前端開發。個性就像動態語言般隨興,但渴望做事能像囉嗦的靜態語言那樣嚴謹。

則留言
Allen Allen

偶然看到介紹各種 JOIN Type 的差別 雖然非常基礎,但還是想要寫一篇文章回味一下

顯示更多留言
新增留言
訪客 2026 年 03 月 17 日