SQL 連接類型示例:內連接與外連接
示例數據表
假設我們有兩個表:
employees 表:
emp_id | emp_name | dept_id |
---|---|---|
1 | 張三 | 101 |
2 | 李四 | 102 |
3 | 王五 | 103 |
4 | 趙六 | NULL |
departments 表:
dept_id | dept_name |
---|---|
101 | 銷售部 |
102 | 技術部 |
104 | 財務部 |
1. 內連接 (INNER JOIN)
內連接只返回兩個表中匹配的行。
相當于左右表兩個列做交集運算。
SELECT e.emp_name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;
結果:
emp_name | dept_name |
---|---|
張三 | 銷售部 |
李四 | 技術部 |
說明:只返回了 dept_id 在兩個表中都存在的記錄(101 和 102),王五(103)和趙六(NULL)沒有匹配的部門,財務部(104)沒有匹配的員工,所以都不出現在結果中。
2. 左外連接 (LEFT OUTER JOIN)
左外連接返回左表的所有行,以及右表中匹配的行(不匹配則為 NULL)。
相當于左右表兩個列做交集運算,再補充上左表對右表的差集。
SELECT e.emp_name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;
結果:
emp_name | dept_name |
---|---|
張三 | 銷售部 |
李四 | 技術部 |
王五 | NULL |
趙六 | NULL |
說明:保留了左表(employees)的所有記錄,王五和趙六沒有匹配的部門信息,所以 dept_name 為 NULL。
3. 右外連接 (RIGHT OUTER JOIN)
右外連接返回右表的所有行,以及左表中匹配的行(不匹配則為 NULL)。
相當于左右表兩個列做交集運算,再補充上右表對左表的差集。
SELECT e.emp_name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.dept_id;
結果:
emp_name | dept_name |
---|---|
張三 | 銷售部 |
李四 | 技術部 |
NULL | 財務部 |
說明:保留了右表(departments)的所有記錄,財務部沒有匹配的員工,所以 emp_name 為 NULL。
4. 全外連接 (FULL OUTER JOIN)
全外連接返回兩個表中的所有行,不匹配的部分為 NULL。
相當于左右表兩個列做并集運算。
SELECT e.emp_name, d.dept_name
FROM employees e
FULL JOIN departments d ON e.dept_id = d.dept_id;
結果:
emp_name | dept_name |
---|---|
張三 | 銷售部 |
李四 | 技術部 |
王五 | NULL |
趙六 | NULL |
NULL | 財務部 |
說明:包含了兩個表的所有記錄,不匹配的部分用 NULL 填充。
關鍵區別總結
連接類型 | 結果包含 |
---|---|
INNER JOIN | 只返回兩個表中匹配的行 |
LEFT JOIN | 返回左表所有行 + 右表匹配行(不匹配的右表字段為 NULL) |
RIGHT JOIN | 返回右表所有行 + 左表匹配行(不匹配的左表字段為 NULL) |
FULL JOIN | 返回兩個表所有行(不匹配的部分為 NULL) |
注意:MySQL 不支持 FULL OUTER JOIN,但可以通過 LEFT JOIN 和 RIGHT JOIN 的組合來實現類似效果。