当前位置: 首页 > article >正文

【后端面试总结】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的结果来实现类似效果。


http://www.kler.cn/a/518930.html

相关文章:

  • 【开源免费】基于Vue和SpringBoot的景区民宿预约系统(附论文)
  • 蓝桥杯之c++入门(一)【第一个c++程序】
  • Spring Boot应用中实现基于JWT的登录拦截器,以保证未登录用户无法访问指定的页面
  • 【Java-数据结构】Java 链表面试题上 “最后一公里”:解决复杂链表问题的致胜法宝
  • gitlab处理空文件夹的提交或空文件夹提交失败
  • 最新常见的图数据库对比,选型,架构,性能对比
  • maven 全局配置
  • 【Python使用】嘿马python高级进阶全体系教程第11篇:静态Web服务器-面向对象开发,1. 以面向对象的方式开发静态W
  • 79,【3】BUUCTF WEB [GXYCTF2019]BabysqliV3.0
  • mongoDB常见指令
  • Go中new和make的区别对比
  • 机器学习的通俗解释
  • Node.js下载安装及环境配置教程 (详细版)
  • 服务器中的流量主要是指什么?
  • RPC是什么?和HTTP区别?
  • Python 对列表进行排序的 5 种方法
  • C++17 新增属性详解
  • Unity在WebGL中拍照和录视频
  • 通过Python编程语言实现“机器学习”小项目教程案例
  • 【Rust自学】15.2. Deref trait Pt.1:什么是Deref、解引用运算符*与实现Deref trait
  • Mongodb副本集群为什么选择3个节点不选择4个节点
  • 【Matlab高端绘图SCI绘图模板】第002期 绘制面积图
  • Spring中的事务管理器TransactionManager
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.2 ndarray解剖课:多维数组的底层实现
  • 「 机器人 」扑翼飞行器混合控制策略缺点浅谈
  • 在centos下使用containerd管理容器:5分钟从docker转型到containerd