【后端面试总结】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将客户表和订单表连接起来。

语法

sql 复制代码
SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.common_column = table2.common_column;

示例

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

sql 复制代码
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。

语法

sql 复制代码
SELECT column1, column2, ...
FROM table1
LEFT JOIN table2
ON table1.common_column = table2.common_column;

示例

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

sql 复制代码
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在某些特定场景下也非常有用。

语法

sql 复制代码
SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2
ON table1.common_column = table2.common_column;

示例

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

sql 复制代码
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的结果合并起来:

sql 复制代码
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方法:

sql 复制代码
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的结果来实现类似效果。

相关推荐
sysu631 小时前
95.不同的二叉搜索树Ⅱ python
开发语言·数据结构·python·算法·leetcode·面试·深度优先
‘’林花谢了春红‘’2 小时前
Leetcode::3432. 统计元素和差值为偶数的分区方案
算法·leetcode·职场和发展
betazhou3 小时前
sysbench压力测试工具mysql以及postgresql
数据库·mysql·postgresql
老苏畅谈运维7 小时前
MySQL性能分析的“秘密武器”,深度剖析SQL问题
数据库·sql·mysql
Java诗人DK8 小时前
windows 安装 mysql 教程
数据库·windows·mysql
言之。13 小时前
【架构面试】一、架构设计认知
面试·职场和发展·架构
曲奇是块小饼干_13 小时前
leetcode刷题记录(九十)——74. 搜索二维矩阵
java·数据结构·算法·leetcode·职场和发展·矩阵
测试199813 小时前
Pytest+Allure+Excel接口自动化测试框架实战
自动化测试·软件测试·python·测试工具·职场和发展·excel·pytest
HappyAcmen15 小时前
Maven面试试题及其答案解析
java·面试·maven
memorycx17 小时前
MySQL(1)
数据库·mysql