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

MYSQL 什么是内连接 外连接 左连接 右连接?及适用场景

在 SQL 中,连接(JOIN)是用于组合来自两个或更多表的行的一种方法。根据连接的方式不同,可以分为几种类型的连接:内连接(INNER JOIN)、外连接(OUTER JOIN)、左连接(LEFT JOIN)和右连接(RIGHT JOIN)。下面分别对这些连接类型进行详细解释:

  1. 内连接(INNER JOIN)
    内连接返回两个表中满足连接条件的所有行。只有当连接条件成立时,才会返回相应的行。

语法:

SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;

示例:
假设有两个表 employees 和 departments,我们想找出所有有部门的员工。

SELECT employees.name, departments.name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
  1. 外连接(OUTER JOIN)
    外连接返回两个表中所有满足连接条件的行,同时还可以返回那些在一个表中存在但在另一个表中不存在的行。外连接分为左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。

左外连接(LEFT JOIN 或 LEFT OUTER JOIN)
左外连接返回左表中的所有行,即使在右表中没有匹配的行也会返回。对于右表中没有匹配的行,结果集中会显示 NULL。

语法:

SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;

示例:
假设我们想找出所有员工及其对应的部门,即使有些员工没有分配部门。

SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;

右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN)
右外连接返回右表中的所有行,即使在左表中没有匹配的行也会返回。对于左表中没有匹配的行,结果集中会显示 NULL。

语法:

SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;

示例:
假设我们想找出所有部门及其对应的员工,即使有些部门没有任何员工。

SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;

全外连接(FULL OUTER JOIN)
全外连接返回两个表中的所有行,无论是否满足连接条件。如果某一行在另一个表中没有匹配的行,结果集中会显示 NULL。

语法:

SELECT columns
FROM table1
FULL OUTER JOIN table2
ON table1.column = table2.column;

示例:
假设我们想找出所有员工和部门的组合,包括没有员工的部门和没有部门的员工。

SELECT employees.name, departments.name
FROM employees
FULL OUTER JOIN departments
ON employees.department_id = departments.id;

总结
内连接(INNER JOIN):返回两个表中满足连接条件的所有行。
左外连接(LEFT JOIN):返回左表中的所有行,即使在右表中没有匹配的行也会返回。
右外连接(RIGHT JOIN):返回右表中的所有行,即使在左表中没有匹配的行也会返回。
全外连接(FULL OUTER JOIN):返回两个表中的所有行,无论是否满足连接条件。

适用场景
  1. 内连接(INNER JOIN)
    用途:

当你需要获取两个表中都存在的记录时。
当你只关心那些在两个表中都有对应记录的数据时。
场景示例:

查询所有有部门的员工。
查找两个表中共同存在的记录。
示例 SQL:

-- 查询所有有部门的员工
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
  1. 左外连接(LEFT JOIN 或 LEFT OUTER JOIN)
    用途:

当你需要获取左表中的所有记录,即使右表中没有匹配的记录。
当你希望保留左表中的所有记录,并且显示右表中匹配的记录,如果没有匹配则显示 NULL。
场景示例:

查询所有员工及其对应的部门,即使有些员工没有分配部门。
获取所有订单及其对应的客户信息,即使有些订单没有关联的客户。
示例 SQL:

-- 查询所有员工及其对应的部门
SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
  1. 右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN)
    用途:

当你需要获取右表中的所有记录,即使左表中没有匹配的记录。
当你希望保留右表中的所有记录,并且显示左表中匹配的记录,如果没有匹配则显示 NULL。
场景示例:

查询所有部门及其对应的员工,即使有些部门没有任何员工。
获取所有客户及其对应的订单信息,即使有些客户没有下单。
示例 SQL:

-- 查询所有部门及其对应的员工
SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
  1. 全外连接(FULL OUTER JOIN)
    用途:

当你需要获取两个表中的所有记录,无论是否满足连接条件。
当你希望保留两个表中的所有记录,并且显示匹配的记录,如果没有匹配则显示 NULL。
场景示例:

查询所有员工和部门的组合,包括没有员工的部门和没有部门的员工。
获取所有客户和订单的组合,包括没有订单的客户和没有客户的订单。
示例 SQL:

-- 查询所有员工和部门的组合
SELECT employees.name, departments.name
FROM employees
FULL OUTER JOIN departments
ON employees.department_id = departments.id;

总结
内连接(INNER JOIN):适用于需要获取两个表中都存在的记录的场景。
左外连接(LEFT JOIN):适用于需要保留左表中所有记录的场景。
右外连接(RIGHT JOIN):适用于需要保留右表中所有记录的场景。
全外连接(FULL OUTER JOIN):适用于需要保留两个表中所有记录的场景。

http://www.lryc.cn/news/496166.html

相关文章:

  • 利用Ubuntu批量下载modis图像(New)
  • 【Springboot】@Autowired和@Resource的区别
  • UIE与ERNIE-Layout:智能视频问答任务初探
  • 数据结构:树
  • docker 怎么启动nginx
  • 【智商检测——DP】
  • YOLOv11改进,YOLOv11添加SAConv可切换空洞卷积,二次创新C3k2结构
  • 使用R语言优雅的获取任意区域的POI,道路,河流等数据
  • 【设计模式】工厂方法模式 在java中的应用
  • Pytest框架学习20--conftest.py
  • 【面试开放题】挫折、问题、擅长、应用技能
  • CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(没思路了)
  • C++学习日记---第16天
  • SOA、分布式、微服务之间的关系和区别?
  • java基础概念46-数据结构1
  • Node.js-Mongodb数据库
  • STM32 ADC --- 知识点总结
  • 技术创新与人才培养并重 软通动力子公司鸿湖万联亮相OpenHarmony人才生态大会
  • 兔子繁衍问题
  • 汉代风云人物 1晁错
  • 学习threejs,使用specularMap设置高光贴图
  • 【UE5 C++】判断两点连线是否穿过球体
  • 【Blender】如何创建空心管道
  • ChromeBook11 HP G7EE 刷入Ubuntu的记录
  • 16asm - 汇编介绍 和 debug使用
  • 初识QT第一天
  • ChatGPT科研应用、论文写作、课题申报、数据分析与AI绘图
  • 原子类、AtomicLong、AtomicReference、AtomicIntegerFieldUpdater、LongAdder
  • c语言——数组名该如何理解呢?
  • Linux学习笔记13 系统进程管理