MySQL 的内连接、左连接、右连接有什么区别?

news/2025/1/17 23:12:31/

MySQL 的内连接、左连接、右连接有什么区别?

在 MySQL 中,内连接(INNER JOIN)、左连接(LEFT JOIN 或 LEFT OUTER JOIN)和右连接(RIGHT JOIN 或 RIGHT OUTER JOIN)是用于合并两个或多个表中的数据的不同类型的连接操作。以下是它们之间的区别:

  1. 内连接(INNER JOIN):

    • 内连接返回两个表中匹配的行,即只返回在两个表中都存在的行。
    • 语法:SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column;
  2. 左连接(LEFT JOIN 或 LEFT OUTER JOIN):

    • 左连接返回左表中的所有行,以及与右表中匹配的行。如果右表中没有匹配的行,返回的结果集中将包含 NULL 值。
    • 语法:SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column;
  3. 右连接(RIGHT JOIN 或 RIGHT OUTER JOIN):

    • 右连接返回右表中的所有行,以及与左表中匹配的行。如果左表中没有匹配的行,返回的结果集中将包含 NULL 值。
    • 语法:SELECT * FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;

下面是一个简单的示例,演示了内连接、左连接和右连接的用法:

示例数据:

-- 表1:employees
CREATE TABLE employees (emp_id INT PRIMARY KEY,emp_name VARCHAR(50),department_id INT
);-- 表2:departments
CREATE TABLE departments (department_id INT PRIMARY KEY,department_name VARCHAR(50)
);-- 数据示例
INSERT INTO employees (emp_id, emp_name, department_id) VALUES (1, 'Alice', 101);
INSERT INTO employees (emp_id, emp_name, department_id) VALUES (2, 'Bob', 102);
INSERT INTO employees (emp_id, emp_name, department_id) VALUES (3, 'Charlie', 101);
INSERT INTO departments (department_id, department_name) VALUES (101, 'HR');
INSERT INTO departments (department_id, department_name) VALUES (102, 'IT');

内连接示例:

-- 内连接返回 employees 和 departments 中 department_id 匹配的行
SELECT employees.emp_id, employees.emp_name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

左连接示例:

-- 左连接返回所有 employees 行,以及与 departments 中 department_id 匹配的行
SELECT employees.emp_id, employees.emp_name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

右连接示例:

-- 右连接返回所有 departments 行,以及与 employees 中 department_id 匹配的行
SELECT employees.emp_id, employees.emp_name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

在这个示例中,employees 表和 departments 表通过 department_id 列进行连接。不同类型的连接操作会返回不同的结果集,涉及到匹配行和 NULL 值的处理。


http://www.ppmy.cn/news/1285528.html

相关文章

猴子摘香蕉python

这是一个简单的 Python 代码示例,模拟了一个猴子摘香蕉的过程: class Monkey:def __init__(self, name):self.name nameself.bananas 0def pick(self, num):self.bananas numprint(f"{self.name} picked {num} bananas.")class Tree:def _…

Spring Boot学习随笔- 集成MyBatis-Plus,第一个MP程序(环境搭建、@TableName、@TableId、@TableField示例)

学习视频:【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备! 引言 MyBatis-Plus是一个基于MyBatis的增强工具,旨在简化开发,提高效率。它扩展了MyBatis的功能,提供了许多实用的特性,…

spring boot使用配置文件对静态变量进行赋值

spring boot value ConfigurationProperties 注释静态配置文件变量引用 1.value 标签加在set方法上面,注意set方法是非静态 private static String userName;Value(value "${user.userName}")public void setUserName(String userName) {HelloWorldServ…

Android 13 默认关闭 快速打开相机

介绍 在设置菜单的手势界面里,快速打开相机是默认开启的,此功能当开启时连续点击两次电源键会打开相机,现在客户需要默认关闭。 效果展示 修改 这里一开始想到的就是配置文件,在路径下果然找到了,从注释中看使我们需要的&#x…

Nature | 大型语言模型(LLM)能够发现和产生新知识吗?

大型语言模型(LLM)是基于大量数据进行预训练的超大型深度学习模型。底层转换器是一组神经网络,这些神经网络由具有自注意力功能的编码器和解码器组成。编码器和解码器从一系列文本中提取含义,并理解其中的单词和短语之间的关系。通…

视频监控EasyCVR如何通过设置sei接口,实现在webrtc视频流中添加画框和文字?

安防视频监控系统基于视频综合管理平台EasyCVR视频系统,采用了开放式的网络结构,可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,具备权限管…

在 Golang 应用程序中管理多个数据库

掌握在 Golang 项目中处理多个数据库的艺术 在当前软件开发领域中,处理单个应用程序内的多个数据库的需求越来越普遍。具有强大功能的 Golang 是处理此类任务的绝佳解决方案,无论您是与多个数据源合作还是仅为增强组织和可扩展性而分隔数据。在本文中&a…

【2023年终总结】纵是一路仆仆风尘,也莫忘了仰头

文章目录 1. 写在前面2. 关于生活3. 关于工作4. 关于以后 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感兴趣的朋…