-- table1 id | name | qq | phone 1 | 秦雲 | 10102800 | 13500000 2 | 在路上 | 10378 | 13600000 3 | LEO | 10000 | 13900000 4 | 秦雲 | 0241458 | 54564512 -- table2 id | name | sjsj | gly 1 | 秦雲 | 2004-01-01 00:00:00 | 李大偉 2 | 秦雲 | 2005-01-01 00:00:00 | 馬化騰 3 | 在路上 | 2005-01-01 00:00:00 | 馬化騰 4 | 秦雲 | 2005-01-01 00:00:00 | 李大偉 5 | 在路上 | 2005-01-01 00:00:00 | 李大偉
僅返回兩表都滿足連接條件的行。
SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.name = t2.name;
結果:8 行(秦雲 2×3=6 行 + 在路上 1×2=2 行),LEO 無對應被過濾。
以左表為主,右表無匹配則 NULL 填充。
SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.name = t2.name;
結果:10 行(內連接 8 行 + LEO 1 行 NULL + 秦雲第 4 行匹配 3 行)。
等價:table2 RIGHT JOIN table1(表順序互換)。
以右表為主,左表無匹配則 NULL。
SELECT * FROM table1 t1 RIGHT JOIN table2 t2 ON t1.name = t2.name;
結果:8 行(同內連接,因右表所有 name 在左表都有匹配)。
MySQL 不直接支援,需 UNION 模擬:
SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.name = t2.name UNION SELECT * FROM table1 t1 RIGHT JOIN table2 t2 ON t1.name = t2.name;
結果:10 行(含 LEO 左表獨有、右表若有獨有也會保留)。
| 連接類型 | 行數公式 |
|---|---|
| INNER JOIN | Σ (左表某值行數 × 右表同值行數) |
| LEFT JOIN | 左表總行數 + Σ (左表某值行數 × (右表同值行數 - 1)) |
| RIGHT JOIN | 右表總行數 + Σ (右表某值行數 × (左表同值行數 - 1)) |
| FULL JOIN | LEFT JOIN 行數 + 右表獨有值行數 |
SELECT *,只取需要欄位減少網路傳輸STRAIGHT_JOIN 強制順序或應用層分批內連:雙方都有才顯示
左連:左表全保留,右表配不上填 NULL
右連:右表全保留,左表配不上填 NULL
全連:左右全保留,MySQL 用 UNION 模擬
掌握四種連接語義與行數推導,複雜報表 SQL 寫得快、改得準。