inner join,left join,right join 有什么区别?
参考回答
INNER JOIN
、LEFT JOIN
和 RIGHT JOIN
是 SQL 中的三种常见连接方式,区别在于如何返回匹配数据和不匹配数据。以下是它们的主要区别和使用场景。
1. 区别对比
特性 | INNER JOIN | LEFT JOIN | RIGHT JOIN |
---|---|---|---|
匹配规则 | 仅返回两张表中符合连接条件的记录 | 返回左表所有记录,即使右表无匹配,也会保留左表记录 | 返回右表所有记录,即使左表无匹配,也会保留右表记录 |
未匹配记录 | 不返回未匹配记录 | 左表未匹配部分用 NULL 填充右表字段 |
右表未匹配部分用 NULL 填充左表字段 |
结果记录数 | 至多等于两表匹配记录数 | 至少等于左表记录数 | 至少等于右表记录数 |
应用场景 | 查询两表之间的匹配数据 | 查询左表的所有数据及其对应的关联数据 | 查询右表的所有数据及其对应的关联数据 |
2. 详细说明
假设有两张表:
employees
(员工表):
id | name | dept_id |
---|---|---|
1 | Alice | 1 |
2 | Bob | 2 |
3 | Carol | NULL |
departments
(部门表):
dept_id | dept_name |
---|---|
1 | HR |
2 | Engineering |
3 | Marketing |
示例 1:INNER JOIN
语法:
SELECT e.id, e.name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;
结果:
id | name | dept_name |
---|---|---|
1 | Alice | HR |
2 | Bob | Engineering |
特点:
– 只返回两表中匹配的记录(e.dept_id = d.dept_id
)。
– 未匹配记录(如 Carol
和 Marketing
)被过滤掉。
示例 2:LEFT JOIN
语法:
SELECT e.id, e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;
结果:
id | name | dept_name |
---|---|---|
1 | Alice | HR |
2 | Bob | Engineering |
3 | Carol | NULL |
特点:
– 返回左表的所有记录。
– 如果右表没有匹配(如 Carol
的 dept_id = NULL
),对应的右表字段用 NULL
填充。
示例 3:RIGHT JOIN
语法:
SELECT e.id, e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.dept_id;
结果:
id | name | dept_name |
---|---|---|
1 | Alice | HR |
2 | Bob | Engineering |
NULL | NULL | Marketing |
特点:
– 返回右表的所有记录。
– 如果左表没有匹配(如 Marketing
的记录),对应的左表字段用 NULL
填充。
3. 选择指南
1) INNER JOIN
的使用场景
- 仅需匹配的关联数据,不关心未匹配记录。
- 示例:查询员工的部门信息,仅返回有部门的员工。
2) LEFT JOIN
的使用场景
- 查询左表的所有数据,右表仅作为补充。
- 示例:查询所有员工,即使他们没有部门,也需显示。
3) RIGHT JOIN
的使用场景
- 查询右表的所有数据,左表仅作为补充。
- 示例:查询所有部门,即使某些部门没有员工,也需显示。
4. 性能对比
- 性能排序:
- 一般情况下,
INNER JOIN
>LEFT JOIN
>RIGHT JOIN
(从性能优到性能差)。 - 原因:
INNER JOIN
仅匹配数据,数据量少,执行效率高。LEFT JOIN
和RIGHT JOIN
需要额外填充NULL
,开销更大。
- 一般情况下,
- 优化建议:
- 确保连接条件字段上有索引。
- 根据业务需求选择合适的连接方式,尽量避免返回多余的记录。
5. 总结
特性 | INNER JOIN | LEFT JOIN | RIGHT JOIN |
---|---|---|---|
返回匹配数据 | 仅返回匹配数据 | 左表所有记录 + 右表匹配数据 | 右表所有记录 + 左表匹配数据 |
未匹配记录处理 | 不包含未匹配记录 | 左表保留,右表用 NULL 填充 |
右表保留,左表用 NULL 填充 |
适用场景 | 仅关心匹配数据 | 左表为主,补充右表数据 | 右表为主,补充左表数据 |
性能 | 高效 | 较高 | 较低 |
根据实际需求选择合适的连接方式,以获得更好的查询结果和性能。