MySQL连接查询深度解析:内连接、左连接、右连接、全连接

在数据库设计和查询中,连接(JOIN)是一个核心概念,它允许我们将不同表中的数据组合在一起,形成一个有意义的结果集。在MySQL中,我们通常会使用四种类型的连接:内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。这篇博客将详细介绍每一种连接的用法,并提供实际的SQL示例及其结果,帮助大家彻底理解这些不可或缺的数据库操作。

内连接(INNER JOIN):精确匹配的艺术

内连接是最常见的连接类型,它只返回两个表中有匹配关系的行。如果某行在被连接的表中没有匹配项,那么这行数据就不会出现在最终的查询结果中。

SQL 示例及结果:

假设我们有两个表:employees(员工表)和departments(部门表)。

-- 员工表
CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),department_id INT
);-- 部门表
CREATE TABLE departments (id INT PRIMARY KEY,department_name VARCHAR(100)
);-- 插入员工数据
INSERT INTO employees (id, name, department_id) VALUES
(1, 'Alice', 1),
(2, 'Bob', 2),
(3, 'Charlie', 1);-- 插入部门数据
INSERT INTO departments (id, department_name) VALUES
(1, 'Human Resources'),
(2, 'Engineering');

要获取每个员工及其所在部门的名称:

SELECT employees.name AS EmployeeName, departments.department_name AS Department
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;

执行结果:

+--------------+-----------------+
| EmployeeName | Department      |
+--------------+-----------------+
| Alice        | Human Resources |
| Bob          | Engineering     |
| Charlie      | Human Resources |
+--------------+-----------------+

左连接(LEFT JOIN):包容性的连接

左连接(或左外连接)返回左表(FROM子句中的表)的所有行,即使在右表中没有匹配的行。如果右表中没有匹配,那么结果集中右表的部分将包含NULL。

SQL 示例及结果:

使用同样的employeesdepartments表,如果我们想要列出所有员工及其所在部门的名称,包括那些没有分配部门的员工:

SELECT employees.name AS EmployeeName, departments.department_name AS Department
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;

执行结果:

+--------------+-----------------+
| EmployeeName | Department      |
+--------------+-----------------+
| Alice        | Human Resources |
| Bob          | Engineering     |
| Charlie      | Human Resources |
+--------------+-----------------+

在这个例子中,由于所有员工都有对应的部门,LEFT JOIN的结果与INNER JOIN相同。如果有员工没有对应的部门,那么Department列将显示为NULL。

右连接(RIGHT JOIN):右表优先的连接

右连接(或右外连接)与左连接相反,它返回右表的所有行,即使左表中没有匹配的行。如果左表中没有匹配,那么结果集中左表的部分将包含NULL。

SQL 示例及结果:

如果我们想要列出所有部门及其员工的名称,包括那些没有员工的部门:

SELECT employees.name AS EmployeeName, departments.department_name AS Department
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;

假设我们的departments表中还有一个没有员工的部门:

INSERT INTO departments (id, department_name) VALUES
(3, 'Marketing');

执行结果:

+--------------+-----------------+
| EmployeeName | Department      |
+--------------+-----------------+
| Alice        | Human Resources |
| Bob          | Engineering     |
| Charlie      | Human Resources |
| NULL         | Marketing       |
+--------------+-----------------+

这里可以看到,Marketing部门没有对应的员工,因此EmployeeName列显示为NULL。

全连接(FULL JOIN):完整视图的连接

全连接(或全外连接)返回左表和右表中的所有行。当某一行在另一表中没有匹配时,会以NULL填充。

由于MySQL不原生支持FULL JOIN,我们可以通过合并LEFT JOIN和RIGHT JOIN的结果来模拟全连接。

SQL 示例及结果:

SELECT employees.name AS EmployeeName, departments.department_name AS Department
FROM employees
LEFT JOIN departments ON employees.department_id = departments.idUNION ALLSELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id
WHERE employees.id IS NULL;

执行结果:

+--------------+-----------------+
| EmployeeName | Department      |
+--------------+-----------------+
| Alice        | Human Resources |
| Bob          | Engineering     |
| Charlie      | Human Resources |
| NULL         | Marketing       |
+--------------+-----------------+

全连接的结果集包括了所有员工和所有部门的列表,无论它们是否有对应的匹配项。

结论

在MySQL中,连接查询是构建复杂查询和报告的基石。它们允许我们在多个表之间建立关系,从而能够提取、比较和分析跨表的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/611134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能测试LoadRunner解决动态验证码问题

对于这个问题,通常我们可以采取以下三个途径来解决该问题: 1、第一种方法,也是最容易想到的,在被测系统中暂时屏蔽验证功能,也就是说,临时修改应用,无论用户输入的是什么验证码,都…

【hcie-cloud】【21】容器详解【容器网络说明、容器存储说明、容器镜像说明、dockerfile详述、缩略词】【下】

文章目录 容器介绍,容器工作机制、容器常用命令说明容器网络容器网络简介容器常用网络类型 - Bridge容器常用网络类型 - Host容器常用网络类型 - None其他容器网络类型【Macvlan、Overlay、IPvlan】容器网络相关配置 容器存储容器中应用数据的存储容器持久化存储配置…

2023年AI的飞速发展(上)

目录 1.ChatGPT: 2.Transformer、Bert: 3.Bard、Office 365 Copilot、LLAMA: 4.Claude、Grok: 1.ChatGPT: 2023年被视为人类科技史上的一个重要年份,可能标志着新一轮工业革命的开端。这一年&#xff…

2024.1.8每日一题

LeetCode 回旋镖的数量 447. 回旋镖的数量 - 力扣(LeetCode) 题目描述 给定平面上 n 对 互不相同 的点 points ,其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式…

Python - 深夜数据结构与算法之 Two-Ended BFS

目录 一.引言 二.双向 BFS 简介 1.双向遍历示例 2.搜索模版回顾 三.经典算法实战 1.Word-Ladder [127] 2.Min-Gen-Mutation [433] 四.总结 一.引言 DFS、BFS 是常见的初级搜索方式,为了提高搜索效率,衍生了剪枝、双向 BFS 以及 A* 即启发式搜索…

【办公技巧】Word中如何对齐选择题中的ABCD选项?

使用word文件制作试卷,如何将ABCD选项全部设置对齐?除了一直按空格或者Tab键以外,还有其他方法吗?今天分享如何将ABCD选项对齐。 首先,我们打开【替换和查找】,在查找内容输入空格,然后点击全部…

2024年工信部AI人工智能证书“计算机视觉工程师”证书报考中!

为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署求,深入实施人才强国战略和创新驱动发展战略,加强全国数字化人才队伍建设,持续推进人工智能专业人员能…

FreeRTOS——任务管理

学习目标 理解任务管理机制掌握动态任务创建掌握任务删除掌握任务挂起和恢复了解静态任务创建了解任务调度机制了解临界区的概念学习内容 任务处理常见操作 操作 API 动态任务创建 xTaskCreate 任务删除 vTaskDelete 静态任务创建 vTaskCreateStatic 挂起任务 vTaskSuspend 恢…

视频做成二维码查看?多格式视频二维码生成器的使用方法

现在音视频是工作和生活中经常需要使用的一种内容表现形式,很多人都通过这种方式来查看视频内容,比如产品介绍、使用说明、安装教程等。通过一个二维码就可以来承载视频内容,与传统的方式相比拥有更快的内容传播速度,简化用户获取…

【刷题笔记2】

刷题笔记2 最小公倍数、最大公约数 两个数的最大公约数两数乘积/最小公倍数 #<include> cmath; int a,b; int mgcd(a,b);//求最大公约数复制字符串substr()函数 s.substr(pos, len) &#xff1a;pos的默认值是0&#xff0c;len的默认值是s.size() - pos string a1;in…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑧

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷8 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷8 模块一 …

创业只有破釜沉舟才能成功吗?2024个人创业做什么?2024普通人如何创业?

第一次创业必须零成本&#xff0c;千万别被那些砸锅卖铁、卖车卖房创业最后发了大财的鸡汤故事洗了脑&#xff0c;否则你一定会血本无归&#xff0c;妻离子散。 如果你要创业&#xff0c;请记住这组数据&#xff0c;全国能活过三年的创业公司只有10%&#xff0c;这10%不等于已经…

C# 自定义配置文件序列化生成+文件格式错误自动回档

文章目录 前言选择Xml简单的Xml使用测试用例简单的写简单的读简单的生成配置修改配置类测试用例运行结果对比 代码逻辑封装逻辑示意封装好的代码测试生成配置文件格式错误测试使用默认值覆盖来解决问题 配置文件人为修改错误如何解决解决方案代码测试用例运行结果 代码封装总结…

uni-app实现一键登录(企业版:因为获取手机号功能**目前针对非个人开发者**,所以个人开发者无法唤起获取手机号界面)

微信授权登录 用户在使用小程序时&#xff0c;其实已登录微信&#xff0c;其本质上就是&#xff1a;微信授权给小程序读取微信用户信息。 获取登录凭证&#xff08;企业版&#xff09; 前端&#xff1a;调用 wx.login() 接口获取登录凭证&#xff08;code&#xff09;。 后…

数据结构期末复习笔记

文章目录 数据结构期末复习第一章&#xff1a;数据结构绪论第二章&#xff1a;顺序表与单链表第三章&#xff1a;其它链表第四章&#xff1a;栈如何中缀转后缀后缀如何计算 第五章&#xff1a;队列第六章&#xff1a;串第七章&#xff1a;树的概念和遍历第八章&#xff1a;赫夫…

muduo网络库剖析——网络地址InetAddress类

muduo网络库剖析——网络地址InetAddress类 前情从muduo到my_muduo 概要socketaddr_in介绍成员用法 网络地址转换函数 框架与细节成员函数使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多情况是否可以高效满足&…

flutter的状态管理学习

文章目录 1.flutter widget分类2. 代理组件又分为3. 状态 state 数据4. 刷新 数据变化5. code 1.flutter widget分类 组合渲染代理 2. 代理组件又分为 Positioned向父组件传递数据InheritedWidget向子组件传递数据 3. 状态 state 数据 状态就是用到了向子组件传递数据&#xff…

在矩池云使用微调ChatGLM3-6B教程

今天给大家介绍下如何在矩池云使用ChatGLM3-6B模型。 1 简介 GitHub&#xff1a;https://github.com/THUDM/ChatGLM3 魔搭&#xff1a;https://modelscope.cn/models/ZhipuAI/chatglm3-6b/ ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的新一代对话预训练模型。ChatGLM3…

租房别再傻傻的扯网线了!随身WiFi靠谱品牌推荐,哪个随身WiFi最好用

如果你是租房党&#xff0c;并且预算有限的话&#xff0c;拉网线太麻烦了&#xff0c;价格很贵&#xff0c;需要搬家的时候还要重新扯线&#xff0c;事儿很多。想买一个网速快&#xff0c;便捷的随身WiFi看电影、刷刷抖音、打打游戏&#xff0c;那一定一定要认真看完我这篇文章…

NSIS 安装windows 安装包(包括QT和MFC)

NSIS&#xff08;Nullsoft Scriptable Install System&#xff09;是一个开源的 Windows 系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。 基本概念 区段 是对应某种安装/卸载选项的处理逻辑&#xff0c;该段代码仅当用户选择相应的选项才被执行…