SQL 连接类型示例:内连接与外连接

发布于:2025-07-31 ⋅ 阅读:(27) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到