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 的组合来实现类似效果。