Bootstrap

【后端面试总结】mysql的join,left join,right join,full join分别是什么意思

MySQL中的JOIN、LEFT JOIN、RIGHT JOIN与FULL JOIN介绍与对比

在MySQL数据库中,JOIN操作是一种强大的工具,用于将两个或多个表中的数据进行组合,以满足复杂的查询需求。本文将详细介绍MySQL中的四种主要JOIN类型:INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN(虽然MySQL不直接支持FULL OUTER JOIN,但可以通过其他方式实现类似效果),并对它们进行对比分析。

一、INNER JOIN(内连接)

定义
INNER JOIN返回两个表中满足连接条件的匹配行。只有当两个表中都存在满足连接条件的行时,这些行才会出现在结果集中。

用途
INNER JOIN通常用于获取两个表中存在匹配关系的记录。例如,查询某个客户的所有订单信息时,可以使用INNER JOIN将客户表和订单表连接起来。

语法

SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.common_column = table2.common_column;

示例
假设有两个表:employees(员工表)和departments(部门表),通过department_id字段关联。要查询每个员工及其所在部门的信息,可以使用INNER JOIN:

SELECT employees.name, departments.name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
二、LEFT JOIN(左连接)

定义
LEFT JOIN返回左表中的所有记录,即使右表中没有匹配的记录。对于右表中没有匹配的行,结果集中相应的列将包含NULL值。

用途
LEFT JOIN通常用于需要保留左表所有记录,并获取与之匹配的右表记录的场景。例如,查询所有客户及其订单信息(包括没有订单的客户)时,可以使用LEFT JOIN。

语法

SELECT column1, column2, ...
FROM table1
LEFT JOIN table2
ON table1.common_column = table2.common_column;

示例
继续使用上述的employeesdepartments表。要查询所有员工及其所在部门的信息(包括没有部门的员工),可以使用LEFT JOIN:

SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
三、RIGHT JOIN(右连接)

定义
RIGHT JOIN返回右表中的所有记录,即使左表中没有匹配的记录。对于左表中没有匹配的行,结果集中相应的列将包含NULL值。

用途
RIGHT JOIN通常用于需要保留右表所有记录,并获取与之匹配的左表记录的场景。虽然在实际应用中,LEFT JOIN更为常见,但RIGHT JOIN在某些特定场景下也非常有用。

语法

SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2
ON table1.common_column = table2.common_column;

示例
假设我们要查询所有部门及其员工信息(包括没有员工的部门),可以使用RIGHT JOIN(虽然这种场景在实际中可能较少见):

SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
四、FULL OUTER JOIN(全外连接)

定义
FULL OUTER JOIN返回两个表中的所有记录,无论它们是否满足连接条件。如果某个表中的行在另一个表中没有匹配的行,则结果集中相应的列将包含NULL值。

用途
FULL OUTER JOIN通常用于需要获取两个表中的所有记录,并查看它们之间匹配关系的场景。然而,MySQL不直接支持FULL OUTER JOIN,但可以通过组合LEFT JOIN和RIGHT JOIN的结果来实现类似效果。

实现方式
使用UNION将LEFT JOIN和RIGHT JOIN的结果合并起来:

SELECT column1, column2, ...
FROM table1
LEFT JOIN table2
ON table1.common_column = table2.common_column
UNION
SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2
ON table1.common_column = table2.common_column;

示例
继续使用employeesdepartments表。要查询所有员工及其所在部门的信息(包括没有部门的员工和没有员工的部门),可以使用上述UNION方法:

SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id
UNION
SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
五、JOIN类型对比
JOIN类型定义用途MySQL支持情况
INNER JOIN返回两个表中满足连接条件的匹配行获取两个表中存在匹配关系的记录支持
LEFT JOIN返回左表中的所有记录,右表中没有匹配的行填充NULL获取左表中的所有记录以及右表中匹配的记录支持
RIGHT JOIN返回右表中的所有记录,左表中没有匹配的行填充NULL获取右表中的所有记录以及左表中匹配的记录支持
FULL OUTER JOIN返回两个表中的所有记录,没有匹配的行用NULL填充获取两个表中的所有记录,即使它们之间没有匹配关系不直接支持,可通过UNION模拟
六、总结

MySQL提供了多种类型的JOIN操作,每种JOIN都有其特定的用途和语法。在实际应用中,应根据具体需求选择合适的JOIN类型。同时,考虑到性能问题,应确保对用于连接的列创建索引,并尽量避免不必要的JOIN操作。对于FULL OUTER JOIN这种MySQL不直接支持的操作,可以通过组合LEFT JOIN和RIGHT JOIN的结果来实现类似效果。

;